如果在Django表单中选中了另一个字段,则将该字段设为必填字段

如果在Django表单中选中了另一个字段,则将该字段设为必填字段,django,django-forms,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\u activity,我希望需要activity\u name。因此,我试图覆盖\uuuu init\uuu方法: class New

我有一个这样的模型:

class News(models.Model):
    is_activity = models.BooleanField(default=False)
    activity_name = models.CharField(max_length=240, blank=True, null=True)
我试图实现的是,如果选中了
is\u activity
,我希望需要
activity\u name
。因此,我试图覆盖
\uuuu init\uuu
方法:

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
即使我签入了
是活动
活动名称
也不是必需的。有什么问题吗?

使用
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

self.fields是一个字典,映射表单上的字段实例,而不是您传递的值。工作非常完美。非常感谢。如果其他人也在尝试将此应用于django cms插件:在您的
cms_plugins-py
add
from django.forms import ModelForm
from cms.admin.placeholderadmin import FrontendEditableAdminMixin
中,将其应用于您的
cms_plugins.py
。是的,您的管理员定义如下:
classmyplugin(FrontendEditableAdminMixin,CMSPluginBase):