标签: htmx

使用 htmxjs 将数据加载到表单中

我正在使用HTMXJS一个 javascript 库,它允许您直接在 HTML 中访问 AJAX。

虽然了解了HTMX的基本逻辑,但还是有一些方面没搞懂。

我设法制作了一个表格并将数据写入服务器:

<form id="my-form">
    <input type="text" name="firstname">
    <input type="text" name="secondname">

    <button type="button"
        hx-post="write.php"
        hx-target="#container-div"
        hx-swap="innerHTML"> 
        Submit
    </button>
</form>

<div id="container-div"></div>
Run Code Online (Sandbox Code Playgroud)

HTMX 将读取所有name内容并将它们提交到write.php可以使用以下循环读取的位置$_POST

写.php:

foreach ($_POST as $key => $value) {
    echo "Field ".htmlspecialchars($key)." is ".htmlspecialchars($value)."<br>";
}
Run Code Online (Sandbox Code Playgroud)

我不明白如何用服务器返回的数据填充表单。例如,给定以下表单和以下输出,我想INPUT在按下按钮时填充单个字段:

HTML:

<button type="button"
    hx-get="load.php"
    hx-target="#my-form"
    hx-swap="innerHTML">
    Load data
</button>

<form id="my-form">
    <input type="text" name="firstname">
    <input type="text" name="secondname">
</form>
Run Code Online (Sandbox Code Playgroud)

加载.php:

$a = …
Run Code Online (Sandbox Code Playgroud)

javascript php htmx

3
推荐指数
1
解决办法
373
查看次数

如何使用 HTMX 和 Django 将参数传递给视图?

我正在尝试使用django-htmx与 Django 和htmx实现类似按钮,但我不知道如何将其作为参数传递给我的视图以保存相关项目。id

# models.py
class Item(models.Model):
    name = models.CharField()
    like = models.BooleanField(null=True, default=None)
Run Code Online (Sandbox Code Playgroud)

(简化)表显示如下项目:

id  name    like
--  -----   ----
 1  Alpha   None
 2  Beta    None
Run Code Online (Sandbox Code Playgroud)

这个想法是通过点击第一个“None”,Django应该将数据库中第一个项目的相似值更改为“True”,这应该反映在表中:

id  name    like
--  -----   ----
 1  Alpha   True
 2  Beta    None
Run Code Online (Sandbox Code Playgroud)

该表是由如下模板生成的:

<table>
{% for item in page_obj %}
    <tr>
        <td>{{ item.id }}</td>
        <td>{{ item.name }}</td>
        <td id="like-{{ item.id }}"
            hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'
            hx-post="{% url 'save-like' %}?id={{ item.id }}"
            hx-target="#like-{{ item.id }}" 
            hx-swap="outerHTML">
            {{ item.like }} …
Run Code Online (Sandbox Code Playgroud)

django htmx

3
推荐指数
1
解决办法
7634
查看次数

使用 Hyperscript 清除提交时的所有输入字段

我正在使用 htmx 和 hyperscript,我希望在提交时清除下面表单中的所有输入字段:

<form hx-post="/example" hx-target="#table tbody" hx-swap="beforeend"
      _="<what should I write here??>">
        <label class="control-label" for="firstNameInput">First Name</label>
        <input id="firstNameInput" name="firstName" class="form-control" type="text" required placeholder="John"/>
        
        <label class="control-label" for="lastNameInput">Last Name</label>
        <input id="lastNameInput" name="lastName" class="form-control" type="text" required placeholder="Doe"/>
        <button class="btn btn-primary">Add User</button>
    </div>
</form>
Run Code Online (Sandbox Code Playgroud)

我尝试<what should I write here??>用例如on submit put '' into <input/>on submit put '' into <input[value]/>许多其他组合替换,但我无法完成这项工作。

问:提交表单后如何清除所有输入字段?

hyperscript htmx

3
推荐指数
1
解决办法
2269
查看次数

当 Hyperscript 中所有输入字段都有效时启用提交按钮?

我正在使用 htmx 和 hyperscript,我希望当表单中所有必需的输入字段都有效时启用“提交按钮”(添加用户)。在这种情况下,必须定义非空名称和有效的电子邮件地址。

<form hx-post="/example" hx-target="#table tbody" hx-swap="beforeend">
        <label class="control-label" for="nameInput">Name</label>
        <input id="nameInput" name="name" class="form-control" type="text" required placeholder="John Doe"/>
        
        <label class="control-label" for="emailInput">Email</label>
        <input id="emailInput" name="email" class="form-control" type="email" required placeholder="john@doe.org"/>
        <button _="<what should I write here??>" class="btn btn-primary" disabled>Add User</button>
    </div>
</form>
Run Code Online (Sandbox Code Playgroud)

我应该写什么而不是<what should I write here??>让这种情况发生?

hyperscript htmx

3
推荐指数
1
解决办法
1533
查看次数

文件不在 request.FILES 中,而是在 request.POST 中 我正在使用 htmx 发出发布请求

我有一些输入片段,当满足条件时,我会渲染到 html 页面,除了文件类型的输入之外,一切正常,我想在发生更改时上传文件,但文件对象不在 request.FILES 中,它现在在 request.POST 中我不介意它是 request.POST 但文件显示为'multiple': ['[object File]']

我的部分模板

<div class="my-2">
    <div id="uploaded"></div>
    <p class="lead">{{question.prompt}}</p>
    <input name="multiple" type="file" accept="image/*, .pdf" id="image_{{question.id}}"
        {% if question.required %}required{% endif %} {% if question.disabled %}disabled{% endif %} class="form-control"
        placeholder="{{question.placeholder}}" hx-post="{% url 'survey:file_multiple' %}" hx-trigger="change">
    <input type="hidden" name="filemultipleId"
        value="{% if question.form_input_type == 'file-multiple' %}{{question.id}}{% endif %}">
</div>
Run Code Online (Sandbox Code Playgroud)

我没有使用 django 表单渲染表单,因为实现我正在寻找的动态性将是困难且几乎不可能的

request.POST 查询字典

<QueryDict: {'csrfmiddlewaretoken': ['TiLZFEWw88cqItD8MABv6lZKYDrNaVxGF4ZMDOV3sK43540z6uOcrx5uQO6iYldA', 'date': [''], 'dateId': ['20', '5'], 'multiple': ['[object File]'], 'filemultipleId': ['18'], 'fileId': ['17']}>
Run Code Online (Sandbox Code Playgroud)

追溯

Internal Server Error: …
Run Code Online (Sandbox Code Playgroud)

django django-file-upload htmx

3
推荐指数
1
解决办法
1386
查看次数

HTMX + Django - 在 HTML 表中编辑 ModelForm

对于 HTMX 和 Django 来说,我想要实现的是在页面上有一个 ModelForm,并带有一个按钮,允许用户直接在页面上“编辑”字段值。按“编辑”按钮后,页面应显示“取消”和“提交”按钮。它与 HTMX 网站上的这个示例基本相同:Edit Row

  • 取消应该放弃编辑并再次显示表格(原样)
  • 提交应该将所做的更改发布回模型中

在索引页查看:

在此输入图像描述


这是我到目前为止所拥有的(当用户按下“编辑条目”时),但它没有按预期工作:

在此输入图像描述

有几个问题:

  1. 当按下“编辑”按钮时,ModelForm 会将所有内容加载到 HTML 表的第一列中。理想情况下,我希望模型的每个字段都位于表中的“正确”位置。

  2. 当按下“取消编辑”按钮时,会将 ModelForm 交换回 HTML 模板。我不想要这个,只是想让表行恢复到以前的状态。

  3. 提交按钮不会将数据发送回模型。


我不确定如何真正考虑这里的设计以使 HTML 表和 ModelForm 按预期工作(#1 和 #2)。

对于#3,问题似乎是 PUT request.method 作为空的 QuerySet 返回。

感谢您提供的任何帮助。一旦我开始工作,我将上传一个简短的视频到 YouTube,以帮助其他初学者,因为除了这个简单的实现的文档之外,我无法在网上找到任何示例。


基本 HTML 模板

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <!-- Bootstrap -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-A3rJD856KowSb7dwlZdYEkO39Gagi7vIsF0jrRAoQmDKKtQBHUuLZ9AsSv4jD4Xa" crossorigin="anonymous"></script>

    <!-- HTMX -->
    <script src="https://unpkg.com/htmx.org@1.8.0" integrity="sha384-cZuAZ+ZbwkNRnrKi05G/fjBX+azI9DNOkNYysZ0I/X5ZFgsmMiBXgDZof30F5ofc" crossorigin="anonymous"></script>

</head>

{% block …
Run Code Online (Sandbox Code Playgroud)

django htmx

3
推荐指数
1
解决办法
1123
查看次数

动态添加 Django 表单集实例并使用 HTMX POST 的正确方法是什么?

我正在使用htmx i制作带有嵌套动态表单集的表单(想要逃避 usign JS,但如果别无选择...)来实例化更多表单集字段以制作动态嵌套表单,但是当我POST时,仅来自1 个实例(最后一个)的数据被 POSTed,表单的其余部分正确 POST,并且获取与Chlid formset Child modelParent model

我阅读了有关如何POST 表单集实例的django 文档,并尝试将其应用到我的代码中,我也知道如何同时发布这 两个实例。对于表单集,我正在向包含子表单集的部分模板发出 htmx get 请求hx-get ,效果很好,唯一的问题是这总是将表单集返回到客户端,因此对于POST数据会重复每个字段的次数,并且只获取最后一个实例中放置的数据,但是我尝试更改表单集上的值以使更多表单直立,这给出了预期的结果,每个表单一个子实例,所以我的问题是htmx以及我调用实例的方式。ParentChildform-0xextra=intextra=intnew Child formset

这是我的代码。(我计划在此表单中嵌套更多子表单集,因此为了方便起见,我将其称为sformset

****views.py****

def createPlan(request):#Requst for the Parent form 

    form = PlanForm(request.POST or None)
    sformset = StructureFormset(request.POST or None) #Nesting the Child formset

    context = { …
Run Code Online (Sandbox Code Playgroud)

django formset htmx

3
推荐指数
1
解决办法
1789
查看次数

HTMX 指示器将内容向下移动而不是替换它

我正在使用 HTMX 并创建了一个加载指示器。指标被触发,除了一件事之外,一切都按预期进行。

该指示器显示在我的内容上方,而不是隐藏/替换它。这看起来真的很糟糕,我花了很长时间来解决这个问题——但没有任何运气。

这是我的 HTML 代码:

<a href="#financial-data" data-toggle="tab"
   hx-indicator=".loader"
   hx-get="/my/url"
   hx-trigger="click, budget-saved from:body"
   hx-target="#financial-data"
   hx-swap="innerHTML">Click me</a>
<div class="tab-pane" id="financial-data">
    <div class="loader htmx-indicator"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

我试图捕捉这个事件,但这 a) 不起作用,b) 感觉超级黑客:

document.body.addEventListener('htmx:beforeSend', (e) => {
    if('hx-indicator' in e.target.attributes) {
        $(e.detail.target).html('<div class="loader htmx-indicator"></div>');                
    }
});
Run Code Online (Sandbox Code Playgroud)

有什么想法我做错了什么吗?我不可能是第一个为此挣扎的人,对吗?

编辑:

API 将返回如下内容:

<div class="loader htmx-indicator"></div>
<table><tr><td>My data</td></tr></table>
Run Code Online (Sandbox Code Playgroud)

这是我的加载器 CSS:

.loader {
    display: none;
}

.htmx-request .loader {
    display: block;
}

.htmx-request.loader {
    display: block;
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

htmx

2
推荐指数
1
解决办法
2313
查看次数

根据请求标头(HTMX)生成完整页面或 HTML 片段

当将 HTMX 框架与 Python Flask 结合使用时,您必须能够:

  • 如果请求是由 HTMX(通过 AJAX)完成的,则将其作为 HTML片段提供服务

  • 如果用户完成请求(例如直接在浏览器 URL 栏中输入),则将请求作为完整页面进行服务器处理

有关更多详细信息,请参阅具有固定页眉/页脚和 HTMX 的单页应用程序,具有浏览 URL 历史记录允许手动页面重新加载 。

如何使用 Flask 模板系统做到这一点?

from flask import Flask, render_template, request
app = Flask("")
@app.route('/pages/<path>')
def main(path):
    htmx_request = request.headers.get('HX-Request') is not None
    return render_template(path + '.html', fullpage=not htmx_request)
app.run()
Run Code Online (Sandbox Code Playgroud)

输出整页的标准方法是什么(基于父模板pagelayout.html):

{% extends "pagelayout.html" %}
{% block container %}
<button>Click me</button>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

iffullpageTrue,并且只是一个 HTML 片段:

<button>Click me</button>
Run Code Online (Sandbox Code Playgroud)

如果是False

python jinja2 flask htmx

2
推荐指数
1
解决办法
874
查看次数

HTMX 的多个触发器?

我想知道是否可以为 HTMX 启用多种触发器类型。我想要做的是在内容更改或页面加载时触发 HTMX。到目前为止,如果我在 中包含两种触发器类型hx-trigger,则只执行第一个触发器;因此在下面的示例中,仅在内容更改时触发 HTMX。

<select name="area" id="area" hx-post="/api/search" hx-trigger="change load" hx-target="#neighborhood" class="block">
  <option>eby</option>
  <option>nby</option>
  <option>pen</option>
  <option>sfc</option>
  <option>scz</option>
  <option>sby</option>
</select>
Run Code Online (Sandbox Code Playgroud)

html javascript flask htmx

1
推荐指数
1
解决办法
77
查看次数

Htmx 的多个目标

我的 htmx 上有多个触发器。

<input list="users_list" type="text" name="user_name" class="search-bar" placeholder="Username"
    id="user_search_bar"
    value=""
    hx-trigger="keyup delay:500ms, change"
    x-headers='{"X-CSRFToken": "{{ csrf_token }}"}'
    hx-post="{% url 'search_user' %}"
    hx-target="#users_list"
    <datalist id="users_list">
          <option value="elem">elem</option>
    </datalist>
Run Code Online (Sandbox Code Playgroud)

如何为每个触发器声明一个目标。例如,当触发器是“keyup delay”时,目标应该是“users_list”,如果触发器是“change”,则目标应该是“endor_list”

html javascript htmx

1
推荐指数
1
解决办法
4407
查看次数

表单的 HTMX POST 请求正在运行,但不包含字段数据

我有一个表单应该提交包含表单字段数据的 POST 请求,但是当后端应用程序收到请求时,它是空白的(没有数据)。为什么它不起作用?

<form hx-post="/meme">
    <label for="name">Funny meme name</label>
    <input type="text" id="name">

    <label for="rating">Funniness rating</label>
    <input type="number" id="rating">

    <button type="submit">Submit!</button>
</form>
Run Code Online (Sandbox Code Playgroud)

htmx

0
推荐指数
1
解决办法
3096
查看次数