从Django模板内部发送POST数据'for loop'

时间:2016-06-27 06:09:21

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

使用此HTML:

...

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

我的网站列出了我的数据库中的多个“内容”,因此可以在一个页面上生成多个表单。我怎么能以某种方式在我的views.py中确定哪个“东西”形式正在提交?

更详细说明:

想象一下,您有一个接一个列出的对象页面,并且每个对象都有一个与之关联的类似按钮,它会为它旁边的对象添加一个类似的对象。这基本上就是我在这里要做的。

问题是,我有一个可以处理类似的表单,但是如何将其添加到页面旁边显示的对象上呢? (通过上述'for loop')

我对如何解决这个问题感到困惑,我是以错误的方式看问题,还是我不知道这个问题的标准习惯用法?

谢谢:)

2 个答案:

答案 0 :(得分:1)

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

# 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模板标记)我们要将每个对象的帖子数据提交到正确的网址。

{% 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标记通过您的网址反向查找为给定网址提供的name kwarg,并接受位置参数(例如,在本例中为thing.pk),以及需要,关键字参数。

答案 1 :(得分:0)

使用Django在一个页面上处理多种同类形式的标准方法是使用Formsets

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

但是,在您的具体情况下可能有点矫枉过正。如果你只是想为一个对象创建一个类似的东西,那么确实没有任何需要验证的用户输入,所以你真的不需要一个表单。只需对指定的URL执行POST,也许使用Javascript。如果用户使用URL混乱,则显示404。