代码之家  ›  专栏  ›  技术社区  ›  Joe

以Django表单获取请求数据

  •  45
  • Joe  · 技术社区  · 15 年前

    是否可以在表单类中获取request.user数据?我想清理一个电子邮件地址,以确保它是唯一的,但如果它是当前用户的电子邮件地址,那么它应该通过。

    这就是我目前拥有的,它对于创建新用户非常有效,但是如果我想编辑一个用户,我会遇到他们的电子邮件无法验证的问题,因为它被认为已经被接收了。如果我可以使用request.user.email检查这是他们的电子邮件,那么我就可以解决我的问题,但我不知道如何做到这一点。

    class editUserForm(forms.Form):
        email_address = forms.EmailField(widget=forms.TextInput(attrs={'class':'required'}))
    
        def clean_email_address(self):
            this_email = self.cleaned_data['email_address']
            test = UserProfiles.objects.filter(email = this_email)
            if len(test)>0:
                raise ValidationError("A user with that email already exists.")
            else:
                return this_email
    
    4 回复  |  直到 8 年前
        1
  •  75
  •   avenet    4 年前

    正如ars和Diarmuid所指出的,您可以通过 request.user 并将其用于验证电子邮件。然而,Diarmuid的代码是错误的。代码实际上应该是:

    from django import forms
    
    class UserForm(forms.Form):
        email_address = forms.EmailField(
            widget=forms.TextInput(
                attrs={
                    'class': 'required'
                }
            )
        )
    
        def __init__(self, *args, **kwargs):
            self.user = kwargs.pop('user', None)
            super(UserForm, self).__init__(*args, **kwargs)
    
        def clean_email_address(self):
            email = self.cleaned_data.get('email_address')
    
            if self.user and self.user.email == email:
                return email
    
            if UserProfile.objects.filter(email=email).count():
                raise forms.ValidationError(
                    u'That email address already exists.'
                )
    
            return email
    

    然后,在您看来,您可以这样使用它:

    def someview(request):
        if request.method == 'POST':
            form = UserForm(request.POST, user=request.user)
            if form.is_valid():
                # Do something with the data
                pass
        else:
            form = UserForm(user=request.user)
        # Rest of your view follows
    

    请注意,您应该将request.POST作为关键字参数传递,因为构造函数期望“user”作为第一个位置参数。

    user request.POST 作为位置参数或关键字参数(通过 data=request.POST ).

        2
  •  39
  •   bbill    7 年前

    以下是使用常规视图时在表单中获取用户的方法:

    在视图中,传递 request.user get_form_kwargs :

    class SampleView(View):
        def get_form_kwargs(self):
            kwargs = super(SampleView, self).get_form_kwargs()
            kwargs['user'] = self.request.user
            return kwargs
    

    以您将收到 user __init__ 功能:

    class SampleForm(Form):
        def __init__(self, user, *args, **kwargs):
            super(SampleForm, self).__init__(*args, **kwargs)
            self.user = user
    
        3
  •  4
  •   Jérémy F.    12 年前

    正如您所知,使用Django 1.4和基于泛型类的CreateView和UpdateView,每个模型表单上都会填充一个self.instance,这允许您比较发布的电子邮件和当前用户的电子邮件。

    下面是一个使用mixin的代码示例

    class EmailUniqueMixin(object):
        """
        Ensure each User's email is unique
        on the form level
        """
        def clean_email(self):
            email = self.cleaned_data['email']
            existing_email = User.objects.filter(email=email).exclude(pk=self.instance.id)
            if existing_email:
                raise forms.ValidationError('That email address already exists')
            else:
                return email
    
        4
  •  0
  •   ars    15 年前

    __init__ 获取可选的电子邮件参数,该参数可以存储为属性。如果在表单创建时提供,它可以在验证期间用于您感兴趣的比较。