django modelformset创建一个对象

时间:2013-03-01 10:00:49

标签: django django-models

我正在创建一个允许匿名输入数据的应用程序,并将我的困难归结为一个简单的作者示例。

我的问题是每次输入新作者时,提交后呈现的表单数量会增加N + 1作者。 (即第一次使用,有1个表格,然后是2个,然后是3个)。我只想显示一个空白表单,然后再使用其他应用程序来检索数据。

似乎有两种方法可以解决问题。 1)获取formset.management_form以返回最后一个表单(例如切片:'{form for formset [-1]%}',这不起作用.2)要使view.py只发送一个新表单而不是render_to_response()中的formset - 如何做到这一点?

--- --- models.py

from django.db import models
from django.forms import ModelForm

class Author(models.Model):
    first_name = models.CharField(max_length=50)

class AuthorForm(ModelForm):
    class Meta:
        model = Author

--- / models.py ---

--- --- views.py

django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.forms.models import modelformset_factory
from author.models import Author , AuthorForm

def manage_authors(request):
    AuthorFormSet = modelformset_factory(Author)
    if request.method == 'POST':
    formset = AuthorFormSet(request.POST)
    if formset.is_valid():
            formset.save()
    else:
        formset = AuthorFormSet()
    return render_to_response("manage_authors.html",{"formset": formset,})

--- / views.py ---

--- --- manage_authors.html

<!DOCTYPE html>
<html lang="en"
      <body>
        <form action="" method="post">
          <table>
            {{ formset.management_form }}
            {% for form in formset %}
            {{ form }}
            {% endfor %}
          </table>
          <button type="submit">Submit</button>
        </form>
      </body>
</html>

--- / manage_authors.html ---

--- --- urls.py

from django.conf.urls import patterns, include, url
from author.views import manage_authors
urlpatterns = patterns('',
    url(r"^author/$", manage_authors),
)

--- / urls.py ---

更新: 感谢您使用modelform的建议。 django文档只显示了与modelformset的模板交互。使用:

--- --- views.py

def manage_authors(request):
    form = AuthorForm(request.POST)
    if request.method == 'POST':
        if form.is_valid():
            form.save()
    else:
        form = AuthorForm()
    return render_to_response("manage_authors.html",{"form": form,})

--- / views.py

并且只使用manage_authors.html中的代码{{form}},做我需要的。

1 个答案:

答案 0 :(得分:0)

在创建模型formset时尝试使用max_num and extra字段作为

AuthorFormSet = modelformset_factory(Author, max_num=1, extra=1)    

如果没有任何形式,这将尝试显示最多1个表单。

但是,您可能需要考虑是否真的必须使用modelformset作为 @Daniel Roseman 建议。