6

私のforms.py:

class AlertForm(forms.ModelForm):
class Meta:
    model=Alert
    fields = ('high','medium', 'user')
    widgets = {
        'user':  forms.HiddenInput()
    }

AlertCountFormset = modelformset_factory(Alert,
                                       form = AlertForm)

別のDjangoフォームクラス:

class NotifierForm(forms.ModelForm):
high = forms.ChoiceField(choices=NOTIFIER_TYPE)
medium = forms.ChoiceField(choices=NOTIFIER_TYPE)
low = forms.ChoiceField(choices=NOTIFIER_TYPE)  

def save(self, commit=True):
    alert = super(NotifierForm, self).save(commit=False)
    alert.high = self.cleaned_data["high"]
    alert.medium = self.cleaned_data["medium"]
    alert.low = self.cleaned_data["low"]
    alert.save()
    return alert

class Meta:
    model=Notifier
    fields = ('high','medium', 'low', 'user')
    widgets = {
        'user': forms.HiddenInput()
    }

NotifierFormset = modelformset_factory(Notifier,
                                    form = NotifierForm)

以下は選択フィールドです。

NOTIFIER_TYPE = (
(0, _('E-mail')),
(1, _('Skype')),
(2, _('IRC'))
)

同じテンプレートでこれら2つのフォームに記入したいと思います。だから私は両方に同じビューを書くことを選択しますすなわち:

def profile_setting(request, slug):
if request.method == 'POST':
    alert_form = AlertForm(request.POST)
    notifier_form = NotifierForm(request.POST)
    if alert_form.is_valid() and notifier_form.is_valid():
        alert = alert_form.save(commit=False)
        notifier = notifier_form.save(commit=False) 
        alert.user = request.user.username
        notifier.user = request.user.username
        notifier.save()
        alert.save()
        return HttpResponseRedirect(reverse('profile_setting', args=[slug]))

extra_context = {
    'alert_form': AlertForm(),
    'notifier_form': NotifierForm()
}
return direct_to_template(request,'users/user_profile_setting.html',
                          extra_context)

私のtemplate.htmlのそれによると:

{% block content %}
<h3>{% trans "Alerts limit" %}</h3>
<form action="" method="POST">{% csrf_token %}
    {{ alert_form.as_p }}
    <input type="submit" value="{% trans 'Update' %}" />
</form>

<h3>{% trans "Notifier setting" %}</h3>
<form action="" method="POST">{% csrf_token %}
    {{ notifier_form.as_p }}
    <input type="submit" value="{% trans 'Update' %}" />
</form>

すべてが正しいです、それはデータベースにもデータを保存しています。しかし、問題は、aler_formに入力して更新ボタンをクリックするたびに発生します。また、同じ値で別のフォームを更新するか、またはその逆を行います。たとえば、私が選択した場合

1 2 3 for high , medium and low for alert_Form

次に、notify_formにも同じ値を保存します。なぜこうなった。それはビューに何か問題がありますか?

4

2 に答える 2

14

prefixフィールド名が衝突しないように引数を使用してください。

例えば:

alert form = AlertForm(request.POST, prefix='alert') 
notifier_form = NotifierForm(request.POST, prefix='notifier')

バインドされていないフォームでも同じプレフィックスを使用する必要があります。

extra_context = { 'alert_form': AlertForm(prefix='alert'),  notifier_form': NotifierForm(prefix='notifier') }

プレフィックスを使用する利点は、umnik700が回答で示唆しているように、フィールドの名前を手動で変更する必要がないことです。

于 2012-06-29T20:54:15.140 に答える
3

問題は、フォームのフィールドの名前が同じであるということです。

request.POSTは、辞書のようなオブジェクトです。したがって、リクエストの名前と値のペアのみが含まれます。両方のフォームでフィールド名が同じである場合は、

alert_form = AlertForm(request.POST)
notifier_form = NotifierForm(request.POST)

それらは同じ値で初期化されます。これを解決するには、2つのフォーム間で名前が一意になるようにします。たとえば、AlertFormのすべてのフィールド名の前に「alert_」を付けます。

于 2012-06-29T20:46:39.330 に答える