【问题标题】:Django form and formset - check if any has users and raise error if notDjango 表单和表单集 - 检查是否有用户,如果没有则引发错误
【发布时间】:2014-01-07 13:47:29
【问题描述】:

我有一个应用程序,它有一个表单,您可以在其中按名称或按表单集指定用户,您可以在其中选择用户组或两者兼而有之。

我需要添加某种验证,当手动和/或从组中选择的用户总和等于 0 时,表单将不会继续。

如何在表单和表单集之间进行通信以引发验证错误? 是否有另一种引发错误的方法,例如典型的表单和表单集?

def form_valid(self, form):
    context = self.get_context_data()
    formset = context.get('formset')

    is_valid = form.is_valid()

    if formset:
        is_valid &= formset.is_valid()

    if not is_valid:
        context['form'] = form

        return self.render_to_response(context)

    task = form.save()

    if self.has_formset():
        added_groups_list = []
        for formset_form in formset:
            ...do something...




class TaskForm(forms.ModelForm):
sms_preview = forms.CharField(
    label=u"Treść wiadomości SMS", required=False, widget=forms.Textarea(attrs={
        'cols': 2,
        'rows': 2,
        'readonly': 'readonly',
    })
)

users = forms.ModelMultipleChoiceField(User.objects.none(), label=u'Użytkownicy', required=False)

class Meta:
    model = Task
    fields = ('procedure', 'priority', 'location', 'message', 'date_from', 'date_to',
              'users')
    widgets = {
        'date_from': DateTimePickerInput,
        'date_to': DateTimePickerInput,
        'procedure': forms.Select(attrs={'class': 'chosen',
                                         "data-placeholder": u"Wybierz procedurę",
                                         }),
        'message': forms.Textarea(attrs={'cols': 2, 'rows': 2,
                                         'placeholder': u"Własna treść wiadomości (opcjonalnie)"
                                         }),
        'hours': forms.TextInput(attrs={'placeholder': u'Godziny'}),
        'minutes': forms.TextInput(attrs={'placeholder': u'Minuty'}),
    }

def __init__(self, *args, **kwargs):
    self.site = kwargs.pop('site')
    self.procedure = kwargs.pop('procedure', None)
    self.user = kwargs.pop('user', None)

    super(TaskForm, self).__init__(*args, **kwargs)

    self.helper = FormHelper()

    layout = Layout('procedure')

    date_from = timezone.now() + timezone.timedelta(hours=1)
    self.fields['date_from'].initial = date_from.strftime("%d.%m.%Y %H:%M")

    date_to = date_from + timezone.timedelta(hours=1)
    self.fields['date_to'].initial = date_to.strftime("%d.%m.%Y %H:%M")

    self.fields['date_from'].required = True
    self.fields['date_to'].required = True
    self.fields['message'].label = ""
    self.fields['users'].widget.attrs = {
        'class': 'chosen',
        'data-placeholder': u'Nie wybrano użytkowników.',
        'readonly': 'readonly',
        'disabled': 'disabled',
    }





class TaskActionGroupFormset(forms.formsets.BaseFormSet):
    def __init__(self, *args, **kwargs):
        self.site = kwargs.pop('site')
        self.procedure = kwargs.pop('procedure', None)
        super(TaskActionGroupFormset, self).__init__(*args, **kwargs)

    @cached_property
    def forms(self):
        return [self._construct_form(i, site=self.site, procedure=self.procedure)
                for i in xrange(self.total_form_count())]

    @property
    def empty_form(self):
        form = self.form(
            auto_id=self.auto_id,
            prefix=self.add_prefix('__prefix__'),
            empty_permitted=True,
            site=self.site,
        )
        self.add_fields(form, None)
        return form

【问题讨论】:

  • 已发布,但我想不会有太大变化。

标签: django forms validation


【解决方案1】:

由于您使用的是 Django 表单,因此您需要使用 clean() method 并覆盖它来运行验证。

【讨论】:

  • 我知道如何使用 clean() 方法,但是如何检查表单和表单集中的用户总和是否 > 0?
猜你喜欢
  • 2018-11-22
  • 1970-01-01
  • 2021-09-01
  • 2020-09-02
  • 1970-01-01
  • 2015-05-13
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多