django:如何在ModelForm中访问当前请求用户?

时间:2011-09-04 14:49:52

标签: django django-admin

在我的ModelForm实现中,我想根据当前用户是否是超级用户执行不同类型的验证检查。如何访问当前请求用户?

4 个答案:

答案 0 :(得分:16)

注意:如果您正在使用基于类的视图(CBV),那么在表单构造函数中传递额外的参数(例如在<D>this is the sample</D> )或get_forms_class中将不起作用,因为{{1}将会出现。

CBV的解决方案是使用form_class,例如:

views.py:

<form> object is not callable

forms.py:

get_form_kwargs

答案 1 :(得分:15)

您可以在表单构造函数中将用户对象作为额外参数传递。

e.g。

f = MyForm(user=request.user)

,构造函数如下:

class MyForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
         self.user = kwargs.pop('user',None)
         super(MyForm, self).__init__(*args, **kwargs)

然后根据需要在clean_XX表单中使用用户

答案 2 :(得分:2)

我的小伙伴

我有一个要求,其中表格的模型选择字段之一取决于request.user,并且花了一些时间。

想法是

  1. 您需要在模型表单类

  2. 中有一个__init__方法
  3. ,然后从request方法的参数

  4. 中访问__init__或其他参数
  5. 然后您需要调用超级构造函数以新建表单类
  6. 然后设置必填字段的queryset

代码示例

class CsvUploadForm(forms.Form):

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(CsvUploadForm, self).__init__(*args, **kwargs)
        self.fields['lists'].queryset = List.objects.filter(user=user)

    lists = forms.ModelChoiceField(queryset=None, widget=forms.Select, required=True)

如您所见,lists变量取决于当前用户,可通过request对象使用,因此我们将字段queryset设置为null,并将其设置为null。稍后从构造函数动态分配。

看看上面代码中的语句顺序

您可以从视图文件中传递这样的用户变量

form = CsvUploadForm(user=request.user)

或与其他POST,FILE数据类似,如下所示

form = CsvUploadForm(request.POST, request.FILES, user=request.user)

答案 3 :(得分:0)

您可以使用实例本身的实例属性来引用用户对象。

Ex; self.instance.user

class StatusForm(ModelForm):

    # def __init__(self, *args, **kwargs):
    #     self.user = kwargs.pop('user', None)
    #     super(StatusForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Status
        fields = [
            'user',
            'content',
            'image'
        ]

    def clean_content(self):
        content = self.cleaned_data.get("content", None)
        if len(content) > 240:
            raise ValidationError(f"Hey {self.instance.user.username}, the content is too long")
        return content