django - 如何使用 HTMX 和 Django 将参数传递给 View ?

标签 django htmx

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

# 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”,这应该反射(reflect)在表中:

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>

点击“无”,会请求以下功能:

#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 )

有人给我提示吗?

最佳答案

您在 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 和 Django 将参数传递给 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67531533/

相关文章:

javascript - 禁用按钮并在行上显示沙漏 (htmx)

python - 从提交在 Django 中运行 Python 脚本

css - HTMX - 目标元素上的过渡

htmx - 在页面加载时加载 div,然后使用 htmx 每 n 秒加载一次?

django - 文件不在 request.FILES 但在 request.POST 我正在使用 htmx 发出发布请求

python - 如何在我的 Tornado 应用程序中使用 Django ORM?

django - 在 Django 中注册应用程序的正确方法

python - 使用rpdb远程调试Python服务器

python - pytz 时区标签以调整模板中打印的日期

javascript - `xhr.getAllHeaders()` 在浏览器扩展上下文中缺少一些 header ?