get request data in Django form

前端 未结 4 1423
有刺的猬
有刺的猬 2020-11-28 23:11

Is it possible to get request.user data in a form class? I want to clean an email address to make sure that it\'s unique, but if it\'s the current users email address then

4条回答
  •  南方客
    南方客 (楼主)
    2020-11-28 23:35

    As ars and Diarmuid have pointed out, you can pass request.user into your form, and use it in validating the email. Diarmuid's code, however, is wrong. The code should actually read:

    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
    

    Then, in your view, you can use it like so:

    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
    

    Note that you should pass request.POST as a keyword argument, since your constructor expects 'user' as the first positional argument.

    Doing it this way, you need to pass user as a keyword argument. You can either pass request.POST as a positional argument, or a keyword argument (via data=request.POST).

提交回复
热议问题