我正在使用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) 我正在尝试使用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) 我正在使用 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]/>
许多其他组合替换,但我无法完成这项工作。
问:提交表单后如何清除所有输入字段?
我正在使用 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??>
让这种情况发生?
我有一些输入片段,当满足条件时,我会渲染到 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) 对于 HTMX 和 Django 来说,我想要实现的是在页面上有一个 ModelForm,并带有一个按钮,允许用户直接在页面上“编辑”字段值。按“编辑”按钮后,页面应显示“取消”和“提交”按钮。它与 HTMX 网站上的这个示例基本相同:Edit Row
在索引页查看:
这是我到目前为止所拥有的(当用户按下“编辑条目”时),但它没有按预期工作:
有几个问题:
当按下“编辑”按钮时,ModelForm 会将所有内容加载到 HTML 表的第一列中。理想情况下,我希望模型的每个字段都位于表中的“正确”位置。
当按下“取消编辑”按钮时,会将 ModelForm 交换回 HTML 模板。我不想要这个,只是想让表行恢复到以前的状态。
提交按钮不会将数据发送回模型。
我不确定如何真正考虑这里的设计以使 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) 我正在使用htmx i制作带有嵌套动态表单集的表单(想要逃避 usign JS,但如果别无选择...)来实例化更多表单集字段以制作动态嵌套表单,但是当我POST时,仅来自1 个实例(最后一个)的数据被 POSTed,表单的其余部分正确 POST,并且获取与Chlid formset
Child model
Parent model
我阅读了有关如何POST 表单集实例的django 文档,并尝试将其应用到我的代码中,我也知道如何同时发布这 两个实例。对于表单集,我正在向包含子表单集的部分模板发出 htmx get 请求hx-get ,效果很好,唯一的问题是这总是将表单集返回到客户端,因此对于POST数据会重复每个字段的次数,并且只获取最后一个实例中放置的数据,但是我尝试更改表单集上的值以使更多表单直立,这给出了预期的结果,每个表单一个子实例,所以我的问题是htmx以及我调用实例的方式。Parent
Child
form-0
x
extra=int
extra=int
new 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) 我正在使用 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 框架与 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)
iffullpage
是True
,并且只是一个 HTML 片段:
<button>Click me</button>
Run Code Online (Sandbox Code Playgroud)
如果是False
?
我想知道是否可以为 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) 我的 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”
我有一个表单应该提交包含表单字段数据的 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 ×12
django ×4
javascript ×3
flask ×2
html ×2
hyperscript ×2
formset ×1
jinja2 ×1
php ×1
python ×1