【问题标题】:Sending POST data from inside a Django template 'for loop'从 Django 模板“for loop”中发送 POST 数据
【发布时间】:2016-06-27 06:09:21
【问题描述】:

使用此 HTML:

...

    {% for thing in things %}
        <form method="post">
             {% csrf_token %}
             {{ thing.name }}
             {{ form.value }}
             <input type="submit" value="Submit" />
        </form>
    {% endfor %}
...

我的网站列出了我的数据库中的多个“事物”,因此可以在一个页面上生成许多表单。如何以某种方式在我的 views.py 中确定正在提交哪个“事物”表单?

详细说明:

假设您有一个对象页面一个接一个地列出,并且每个对象都有一个与之关联的点赞按钮,该按钮会为其旁边的对象添加一个点赞。这基本上就是我在这里想要做的。

问题是,我有一个可以处理类似内容的表单,但我如何将它添加到页面上显示的对象中? (通过前面提到的'for循环')


我对如何解决这个问题完全感到困惑,我是不是以错误的方式看待问题,还是围绕这个问题有一个我不知道的标准习语?

谢谢你:)

【问题讨论】:

  • 不明白你的问题。你能详细说明一下吗?
  • 实际上所有这些表单周围都有单独的&lt;form&gt; 标签,是吗?为什么要使用单个视图处理多个表单?为什么不将表单指向不同的 URL/不同的视图?不过,如果你真的需要用一个视图处理多个提交,为什么不包括一个&lt;input type='hidden' value='thisisform1' /&gt; 字段呢?
  • @dhke 是的,抱歉,这是一个错字!这些表单周围确实有
    标签。
  • @ArpitSrivastava 我试图弄清楚如何详细说明我的问题。我发现很难解释清楚(我敢肯定这只是我缺乏理解)

标签: python django django-forms django-templates django-views


【解决方案1】:

模型实例更新最常见的设计模式是在您提交帖子数据的 url 中提供对象的主键。

# urls.py

from django.conf.urls import *
from library.views import UpdateThing

urlpatterns = patterns('',
    url('^update_thing/(?P<pk>[\w-]+)$', UpdateThing.as_view(), name='update_thing'),

# views.py

def my_view(request, pk=None):
    if pk:
        object = thing.objects.get(pk=pk)
    form = MyModelForm(data=request.POST or None, instance=object)

    if form.is_valid():
        ...

现在,让我们指定(使用 Django 的 url 模板标签)我们希望将每个对象的发布数据提交到正确的 url。

{% for thing in things %}
    <form method="post" action="{% url 'update_thing' thing.pk %}">
         {% csrf_token %}
         {{ thing.name }}
         {{ form.value }}
         <input type="submit" value="Submit" />
    </form>
{% endfor %}

url 标记通过您的 url 反向查找为给定 url 提供的 name kwarg,并接受位置参数(例如,在本例中为 thing.pk),并在需要时接受关键字参数.

【讨论】:

  • 感谢您的精彩回答!所以这可能是一个愚蠢的问题,但是那个视图末尾的返回调用是什么?
  • 无论你想要什么 :) 如果我正在构建它,我会通过 AJAX 提交“喜欢”点击并更新显示的元素以在成功响应后将对象显示为喜欢/不喜欢.为此,我通常使用 [JsonResponse] (docs.djangoproject.com/en/1.9/ref/request-response/…) 作为视图的返回值,并通过客户端的 JQuery 更新元素。
【解决方案2】:

使用 Django 在一个页面上处理多个相同类型的表单的标准方法是使用Formsets。

它处理烦人的细节,例如在一个表单上显示错误,同时在其他表单上保留输入等。

但是,在您的具体情况下,这可能是矫枉过正。如果你只是想为一个对象创建一个like,实际上没有任何需要验证的用户输入,所以你真的不需要一个表单。只需对指定的 URL 执行 POST,可能使用 Javascript。如果用户弄乱了 URL,则显示 404。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    相关资源
    最近更新 更多