0

データの匿名入力を許可するアプリを作成しており、簡単な作成者の例に問題を要約しました。

私の問題は、新しい作成者を入力するたびに、送信後にレンダリングされるフォームの数が N+1 作成者だけ増加することです。(つまり、最初に使用するときは、1 つのフォーム、次に 2、次に 3 のフォームがあります)。空白のフォームを 1 つだけ表示したいので、後で他のアプリを使用してデータを取得します。

問題を解決するには2つの方法があるようです。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 }} を使用するだけで、必要なことを実行できます。

4

1 に答える 1

1

max_numモデルフォームセットを作成するときに、extraフィールドを使用してみてください。

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

存在しない場合、これは最大1つのフォームを表示しようとします。

ただし、 @ Daniel Rosemanが提案したように、実際にmodelformsetを使用する必要があるかどうかを検討することをお勧めします。

于 2013-03-01T10:30:04.473 に答える