0

(私は django の初心者です。これについて何度もグーグル検索しましたが、答えが見つからなかったので、低レベルの質問を気にしないでください) これらのクラスがあります。

class Cl(models.Model):
    user   = models.ForeignKey(User,editable=False)
    title  = models.CharField(max_length=100)

class Member(models.Model):
    name   = models.CharField(max_length=100)
    email  = models.EmailField()
    cl     = models.ForeignKey(Cl)

class ClForm(ModelForm):
    class Meta:
        model = Cl

Cl のオブジェクトと関連するいくつかのメンバー オブジェクトを作成できるページを作成したいと考えています (django-dynamic-formset を使用する予定ですが、それはここでは重要ではありません)。私の見解は次のようになります。

class NewView(TemplateView):
    def get(self, request):
        cform = ClForm(prefix="cl", instance=Cl(user=request.user))
        MemberFormSet = modelformset_factory(Member)
        memberfs = MemberFormSet(queryset=Member.objects.none())
        return render_to_response(self.template_name, {'cl_form': cform, 'memberformset': memberfs}, context_instance=RequestContext(request))

    def post(self,request):
        cform = ClForm(request.POST, prefix="cl", instance=Cl(user=request.user))
        MemberFormSet = modelformset_factory(Member)
        memberfs = MemberFormSet(request.POST)
        if cform.is_valid() and memberfs.is_valid():
            new_cl = cform.save()
            new_members = memberfs.save(commit=False)
            for mf in new_members:
                mf.cl = new_cl
                mf.save()
            return HttpResponseRedirect("unimportant")
        return render_to_response(self.template_name, {'cl_form': cform, 'memberformset': memberfs}, context_instance=RequestContext(request))

私のテンプレートは次のようになります。

<form id="myForm" method="post" action="">
    {% csrf_token %}
    {{ memberformset.management_form }}
    <table>
        {{ cl_form }}
        <tr><th colspan="2">Members</th></tr>
        {% with memberformset.empty_form as form %}
            <div id="id_empty_form" style="display:none;">
                {{ form }}
            </div>
        {% endwith %}
    </table>
    <input type="submit" value="Save" />
</form>

私の問題は、メンバーが保存されていないことです。また、たとえば Email フィールドが正しく入力されていない場合、 memberfs.is_valid() は文句を言いません。inlineformset_factory も試しましたが、うまくいきませんでした。

4

1 に答える 1

0

問題は、そのテンプレートで「 empty_form 」を使用していることだと思います。フォームセットを使用する正しい方法は、ここで説明されています。あなたの例では、次のように書く必要があります。

<form id="myForm" method="post" action="">
{% csrf_token %}
{{ memberformset.management_form }}
<table>
{{ cl_form }}
<tr><th colspan="2">Members</th></tr>

<!-- THIS IS NOT NECESSARY UNLESS YOU WANT TO ADD FORMS WITH JAVASCRIPT-->    
<div id="id_empty_form" style="display:none;">
{{ memberformset.empty_form }}
</div>
<!-- END NOT NECESSARY-->

{% for form in memberformset.forms %}
    {{ form }}
{% endfor %}
{% endwith %}
</tbody>
</table>
<input type="submit" value="Save" />
</form>
于 2013-03-13T03:33:38.003 に答える