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

Posted

技术标签:

【中文标题】如何使用 HTMX 和 Django 将参数传递给视图?【英文标题】:How to pass a parameter to a view with HTMX and Django? 【发布时间】:2021-08-04 11:07:06 【问题描述】:

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

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

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

id  name    like
--  -----   ----
 1  Alpha   None
 2  Beta    None

这个想法是通过点击例如在第一个“None”上,Django 应该将数据库中第一项的 like-value 更改为“True”,这应该反映在表中:

id  name    like
--  -----   ----
 1  Alpha   True
 2  Beta    None

表格是由这样的模板生成的:

<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 传递给函数。(我不明白这个参数是如何与 htmx 一起工作的:https://htmx.org/docs/#parameters )

有人给我提示吗?

【问题讨论】:

【参考方案1】:

您已在 url 查询参数中以?id=1 的形式发送您的 ID,而不是在请求正文中。查询参数可以从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']访问了

【讨论】:

以上是关于如何使用 HTMX 和 Django 将参数传递给视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何将三个或多个参数传递给自定义模板标签过滤器 django?

如何将额外的参数传递给 django admin 自定义表单?

django 1.7 如何将参数传递给函数正则表达式

如何正确地将参数传递给 Django 中的基于类的视图实例?

如何将从表单提交中检索到的参数作为参数传递给 django 中的函数

如何在django中将多个参数传递给url