2

我正在尝试使用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>

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

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

有人对我有提示吗?

4

1 回答 1

2

您已在 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']

于 2021-05-14T09:26:49.693 回答