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'))
)

我想在同一个模板中填写这两个表格。所以我选择为两者写相同的观点,即:

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

The problem is that on your forms the fields have the same names.

request.POST is a dictionary-like object. So it only contains the name/value pairs from the request. If the field names are the same on both of the forms then when you call

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

they are initialized with the same values. To resolve this make the names to be unique between your two forms. For example prefix all the field names on the AlertForm with "alert_".

于 2012-06-29T20:46:39.330 回答