django - 如果在 Django 表单中选中另一个字段,则将字段设为必需

标签 django django-forms

我有一个这样的模型:

class News(models.Model):
    is_activity = models.BooleanField(default=False)
    activity_name = models.CharField(max_length=240, blank=True, null=True)

我想要实现的是,如果 is_activity已入住 我要 activity_name被要求。因此,我试图覆盖 __init__方法:
class NewsForm(forms.ModelForm):
    class Meta:
        model = News

    def __init__(self, *args, **kwargs):
        super(NewsForm, self).__init__(*args, **kwargs)
        if self.fields['is_activity'] is True:
            self.fields['activity_name'].required = True


class NewsAdmin(FrontendEditableAdminMixin, admin.ModelAdmin):
    form = NewsForm

即使我 checkin is_activity activity_name是非必需的。怎么了?

最佳答案

ModelForm.clean()方法使您可以访问清理过的数据——您可以在此处包含特定于字段的条件逻辑:

from django.core.validators import EMPTY_VALUES

class NewsForm(forms.ModelForm):
    class Meta:
        model = News

    def clean(self):
        is_activity = self.cleaned_data.get('is_activity', False)
        if is_activity:
            # validate the activity name
            activity_name = self.cleaned_data.get('activity_name', None)
            if activity_name in EMPTY_VALUES:
                self._errors['activity_name'] = self.error_class([
                    'Activity message required here'])
        return self.cleaned_data

class NewsAdmin(FrontendEditableAdminMixin, admin.ModelAdmin):
    form = NewsForm

关于django - 如果在 Django 表单中选中另一个字段,则将字段设为必需,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22816186/

相关文章:

python - Django Allauth 使用 default_token_generator 时出错

django - 在 Django 中使用 PasswordResetForm

python - 在 django 中为每种站点语言设置单独的子域

Django:在一段时间后更新模型属性

django - 正确集成 Django Oauth Toolkit url

python - Tango with Django - 第 8 章 - 练习

python - 为什么 Django 给我这个 "violates not-null constraint"错误?

python - Django:在模板中显示所选多选字段的值

django - 使用包含 RadioSelect 小部件的 ModelChoiceField 在 ModelForm 中的查询集中获取 request.user

django - 检查现有密码并重置密码