如何使用 HTMX 和 Django 将参数传递给视图?
How to pass a parameter to a view with HTMX and Django?
我正在尝试使用 Django 和 htmx using django-htmx 实现一种类似按钮,但我不知道如何将 id
作为参数传递给我的视图以便保存相关项目。
# models.py
class Item(models.Model):
name = models.CharField()
like = models.BooleanField(null=True, default=None)
(简化)table 显示如下项目:
id name like
-- ----- ----
1 Alpha None
2 Beta None
这个想法是通过点击,例如在第一个“None”上,Django 应该将数据库中第一项的 like-value 更改为“True”,这应该反映在 table:
id name like
-- ----- ----
1 Alpha True
2 Beta None
table 是由这样的模板生成的:
<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 }}
</td>
</tr>
{% endfor %}
</table>
单击“None”,会请求以下函数:
#views.py
def save_like(request):
success = False
if request.method == 'POST':
item = Item.objects.filter(pk=request.POST['id']).first()
item.like == True
item.save()
success = True
if success:
return HttpResponse('<td>True</td>>')
else:
return HttpResponse("Error")
我的问题:request.POST
是空的,我不知道如何将 id
传递给函数。(我不明白这是怎么回事参数 thing 适用于 htmx:https://htmx.org/docs/#parameters )
有人给我提示吗?
您在 url 查询参数中发送了您的 id 作为 ?id=1
而不是在请求正文中。可以从 request.GET
访问查询参数
item_id = request.GET.get('id')
如果你想在请求正文中发送 id 添加一个隐藏的输入字段,并添加 hx-include="[name='id']"
以包含该字段
<td id="like-{{ item.id }}"
hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'
hx-post="{% url 'save-like' %}"
hx-target="#like-{{ item.id }}"
hx-include="[name='id']"
hx-swap="outerHTML">
<input type="hidden" value="{{item.id}}" name="id">
{{ item.like }}
</td>
那么您可以从request.POST['id']
访问
我正在尝试使用 Django 和 htmx using django-htmx 实现一种类似按钮,但我不知道如何将 id
作为参数传递给我的视图以便保存相关项目。
# models.py
class Item(models.Model):
name = models.CharField()
like = models.BooleanField(null=True, default=None)
(简化)table 显示如下项目:
id name like
-- ----- ----
1 Alpha None
2 Beta None
这个想法是通过点击,例如在第一个“None”上,Django 应该将数据库中第一项的 like-value 更改为“True”,这应该反映在 table:
id name like
-- ----- ----
1 Alpha True
2 Beta None
table 是由这样的模板生成的:
<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 }}
</td>
</tr>
{% endfor %}
</table>
单击“None”,会请求以下函数:
#views.py
def save_like(request):
success = False
if request.method == 'POST':
item = Item.objects.filter(pk=request.POST['id']).first()
item.like == True
item.save()
success = True
if success:
return HttpResponse('<td>True</td>>')
else:
return HttpResponse("Error")
我的问题:request.POST
是空的,我不知道如何将 id
传递给函数。(我不明白这是怎么回事参数 thing 适用于 htmx:https://htmx.org/docs/#parameters )
有人给我提示吗?
您在 url 查询参数中发送了您的 id 作为 ?id=1
而不是在请求正文中。可以从 request.GET
item_id = request.GET.get('id')
如果你想在请求正文中发送 id 添加一个隐藏的输入字段,并添加 hx-include="[name='id']"
以包含该字段
<td id="like-{{ item.id }}"
hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'
hx-post="{% url 'save-like' %}"
hx-target="#like-{{ item.id }}"
hx-include="[name='id']"
hx-swap="outerHTML">
<input type="hidden" value="{{item.id}}" name="id">
{{ item.like }}
</td>
那么您可以从request.POST['id']