以Django格式获取请求数据

2024-05-17 03:43:48 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以在窗体类中获取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

Tags: 数据用户testself编辑address电子邮件email
3条回答

正如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)。

正如您所知,使用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

以下是使用通用视图时让用户进入表单的方法:

在视图中,使用get_form_kwargsrequest.user传递到表单:

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

在表单中,您将收到带有__init__函数的user

class SampleForm(Form):
    def __init__(self, user, *args, **kwargs):
        super(SampleForm, self).__init__(*args, **kwargs)
        self.user = user

相关问题 更多 >