【问题标题】:Validating a Django field dependently on context根据上下文验证 Django 字段
【发布时间】:2017-04-02 12:52:23
【问题描述】:

我编写代码来编辑属于某个团队的用户列表。为此,我创建了一个表单,如下所示:

class Organization(models.Model):
    name = models.CharField(blank=False, verbose_name=_("Name"), help_text=_('Organization Name'), max_length=256)

class Team(models.Model):
    organization = models.ForeignKey('Organization')
    name = models.CharField(blank=False, verbose_name=_("Name"), help_text=_('Team Name'), max_length=256)
    users = models.ManyToManyField('User', related_name='teams')

    def __str__(self):
        return self.name

class TeamUsersForm(forms.ModelForm):
    class Meta:
        model = Team
        fields = ['users']

    users = forms.ModelMultipleChoiceField(queryset=User.objects.filter(request.user.organization), required=False)

    def clean_users(self):
        users = self.cleaned_data['users']
        if users.exclude(organization=request.user.organization):
            raise ValidationError(_("Cannot add user from another organization"))
        return users

上面的代码应该查看request 值以确定当前组织并将显示和模型存储限制为仅来自同一组织的用户。

但是上面的代码不能工作,因为request的值在类加载时是未知的。

你有什么建议?

我想到了两种变体:

  1. 创建一个本地(函数)类,如上述类TeamUsersForm

  2. 完全放弃使用 Django 表单并使用更多低级 API

【问题讨论】:

  • 以下答案对您有用吗?
  • @nik_m 是的,它有效

标签: django forms validation


【解决方案1】:

覆盖TeamUsersForm__init__ 并在那里访问request

class TeamUsersForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request')
        super().__init__(*args, **kwargs)
        self.fields['users'] = forms.ModelMultipleChoiceField(queryset=User.objects.filter(self.request.user.organization), required=False)

这意味着当你实例化你的表单时,你应该这样:

# somewhere in your views.py, probably

f = TeamUsersForm(request.POST, request=request)

【讨论】:

  • 我想到了这个,但是TeamUsersForm的字段users是在__init__()之外初始化的。所以我怀疑你的代码是否有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 2019-07-11
相关资源
最近更新 更多