【问题标题】:Django Model form: restricting selection to groupDjango模型表单:将选择限制为组
【发布时间】:2016-10-30 04:21:57
【问题描述】:

我在 Django 中有一个现有的模型表单。 我感兴趣的字段是language_pairs 模型多项选择字段。 以下是部分参赛作品:

  {
"model": "projects.LanguagePair",
"pk": 1,
"fields": {
  "name": "English (en) - German (de)",
  "code": "en_de"
 }
 },
 {
"model": "projects.LanguagePair",
"pk": 2,
"fields": {
  "name": "German (de) - English (en)",
  "code": "de_en"
   }
  },
  {
"model": "projects.LanguagePair",
"pk": 3,
"fields": {
  "name": "French (fr) - English (en)",
  "code": "fr_en"
}

表格代码:

class ProjectForm(forms.ModelForm):
    class Meta:
        model = Project
        fields = ('title', 'notes', 'url', 'content')
        language_pairs =   forms.ModelMultipleChoiceField(queryset=LanguagePair.objects.order_by('code'))

    def __init__(self, *args, **kwargs):
        if kwargs.get('instance'):
            initial = kwargs.setdefault('initial', {})
            initial['language_pairs'] = [t.pk for t in kwargs['instance'].language_pairs.all()]
        super(ProjectForm, self).__init__(*args, **kwargs)

    def save(self, commit=True, user=None):
        instance = super().save(commit=False)
        source_languages = set()
        if commit:
            if user:
                instance.user = user

            instance.save()
            instance.language_pairs.clear()
            for lang in self.cleaned_data['language_pairs']:
                source_languages.add(lang['code'].split("_")[0])
            if len(source_languages) !=1:
                raise ValidationError("You can only have one source language")
            for lang in self.cleaned_data['language_pairs']:
                instance.language_pairs.add(lang)
        return instance

我的问题是,如果任何源语言不同(集合有多个条目),这是引发验证错误的正确位置吗?

【问题讨论】:

    标签: django django-forms modelform


    【解决方案1】:

    提出验证的正确位置: 清理数据时会进行表单验证。如果您想自定义此过程,可以在多个地方进行更改,每个地方都有不同的用途。去阅读文档...

    https://docs.djangoproject.com/en/1.10/ref/forms/validation/#form-field-default-cleaning

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      • 2012-11-23
      • 2012-05-02
      • 2015-07-06
      • 1970-01-01
      • 2011-09-14
      • 2010-11-10
      相关资源
      最近更新 更多