【问题标题】:django modelformset create one objectdjango modelformset 创建一个对象
【发布时间】:2013-03-01 10:00:48
【问题描述】:

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

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

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

---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 }} 即可满足我的需要。

【问题讨论】:

  • 如果您只想要一个空白表单,为什么要使用表单集呢?为什么不只是一个简单的模型形式?

标签: django django-models


【解决方案1】:

在创建模型表单集时尝试使用max_num and extra 字段

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

这将尝试最多显示 1 个表单,如果不存在的话。

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

【讨论】:

  • 谢谢。我正在研究如何根据您的建议使用带有模板的模型表单。当我尝试 modelformset_factory(Author, max_num=1, extra=1) 时,我得到了我想要的补充:我得到了所有以前的记录,但没有空白条目。我想要一个空白。
猜你喜欢
  • 2013-07-09
  • 2013-10-31
  • 2019-09-20
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多