【问题标题】:Allow Django Admin to change whether a field is required允许 Django Admin 更改是否需要某个字段
【发布时间】:2018-12-28 19:26:27
【问题描述】:

我希望能够更改是否需要电子邮件字段,具体取决于我是向朋友还是客户展示,而不必每次都推送到 git 并重新部署。

我已经为 Django 中的其他设置设置了一个配置模型,可以从管理员进行配置,但不幸的是,我无法在其他模型或模型字段中使用任何这些设置,因为它会导致迁移时出现数据库错误。

这是我的代码(由于迁移问题而失败)

class UserForm(forms.ModelForm):
    stake = StakeField()
    email = forms.EmailField(required=getConfig(ConfigData.USER_EMAIL_REQUIRED))

    class Meta:
        model = User
        fields = '__all__'

是否有另一种方法可以在不会导致此问题的模型、模型表单或表单中设置必需/空白设置?

为清楚起见进行编辑:

我已经有 Configuration AdminModel,但我正在努力在没有数据库错误的 ModelForm 字段中使用这个值(真/假),用于面向用户的表单。

【问题讨论】:

标签: django python-3.x django-models configuration django-forms


【解决方案1】:

只编辑表单域的 required 属性有什么问题?

class UserForm(forms.ModelForm):
    stake = StakeField()
    email = forms.EmailField(required=False)

    def clean_email(self, value):
        # In case your database schema does not allow an empty value, otherwise, you can ignore this
        if not self.fields['email'].required and not value:
            # 'A friend' has used the form and the email field was not required
            value = 'whatever default/placeholder value you like'
        return value
    

class MyModelAdmin(admin.ModelAdmin):
    form = UserForm
    
    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        if not is_my_friend(request.user):
            form.base_fields['email'].required = True
        return form

【讨论】:

  • 谢谢,但我认为这不能完全回答我的问题。我已经在管理站点中有用于配置的表单,并使用此配置的结果 (True/False) 我想设置是否需要面向客户的用户表单中的电子邮件字段,即。管理员登录,取消选中管理员配置中的“需要电子邮件”(已构建),下一个注册用户可以将电子邮件字段留空。
  • 在新版本中,使用form.fields,而不是form.base_fields
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
  • 2012-06-23
  • 1970-01-01
  • 2010-11-25
  • 2013-09-02
  • 2014-01-25
  • 1970-01-01
相关资源
最近更新 更多