【问题标题】:Django Model Forms - Setting a required fieldDjango 模型表单 - 设置必填字段
【发布时间】:2011-12-02 17:25:08
【问题描述】:
 15 class Profile(models.Model):
 16     """
 17     User profile model
 18     """
 19     user = models.ForeignKey(User, unique=True)
 20     country = models.CharField('Country', blank=True, null=True, default='',\
 21                                max_length=50, choices=country_list())
 22     is_active = models.BooleanField("Email Activated")

我有一个类似上面的模型,country 设置为 blank=True, null=True

但是,在呈现给最终用户的表单中,我要求填写国家/地区字段。

所以我像这样重新定义模型表单中的字段以“强制”它成为必需的:

 77 class ProfileEditPersonalForm(forms.ModelForm):
 78 
 79     class Meta:
 80         model = Profile
 81         fields = ('email',
 82                   'sec_email',  
 83                   'image',
 84                   'first_name',
 85                   'middle_name',
 86                   'last_name',
 87                   'country',
 88                   'number',
 89                   'fax',)
 90 
 98     country =  forms.ChoiceField(label='Country', choices = country_list())

因此 country 字段只是一个示例(有很多)。有没有更好的更干的方式来做到这一点?

【问题讨论】:

  • 嗯,是的。不要设置它blanknull
  • 我有点需要,因为我需要为第一次没有更新个人资料的新用户显示“个人资料详细信息”页面。

标签: django django-forms


【解决方案1】:

您可以在表单中修改__init__中的字段。这是 DRY,因为标签、查询集和其他所有内容都将从模型中使用。这对于覆盖其他内容也很有用(例如,限制查询集/选择、添加帮助文本、更改标签……)。

class ProfileEditPersonalForm(forms.ModelForm):    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['country'].required = True

    class Meta:
        model = Profile
        fields = (...)

这是一篇描述相同“技术”的博文:http://collingrady.wordpress.com/2008/07/24/useful-form-tricks-in-django/

【讨论】:

  • 我知道super(ProfileEditPersonalForm, self).__init__(*args, **kwargs) 调用了forms.ModelForm 父类__init__ 方法,但是为什么需要呢?
  • 在这种情况下,需要调用super init(即ModelForm.__init__)来为这个表单实例设置self.fields。它还进行了一系列其他使用表单对象所必需的初始化。这是标准的 OO 实践,除非您完全替换一个方法,否则您可能需要以某种方式调用超类方法。
【解决方案2】:

在 Django 3.0 中,例如,如果你想在用户注册表单中设置电子邮件,你可以设置required=True

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm


class MyForm(UserCreationForm):
    email = forms.EmailField(required=True) # <- set here

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

【讨论】:

  • 感谢添加,这比覆盖 __init__() 更简洁、更简单。
  • 谢谢!数小时以来一直试图解决这个问题。
猜你喜欢
  • 2010-11-11
  • 2020-10-09
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 2018-04-18
  • 2019-08-20
相关资源
最近更新 更多