以Django形式获取请求数据 [英] get request data in Django form

查看:432
本文介绍了以Django形式获取请求数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

可以在form类中获取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)
如果len(测试)> 0:
raise ValidationError(具有该电子邮件的用户已存在)
else:
返回this_email


解决方案

正如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')
如果self.user和self.user.email ==电子邮件:
返回电子邮件
如果UserProfile.objects .filter(email = email).count():
raise forms.ValidationError(你的电子邮件地址已经存在了。)
return email
pre>

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

  def someview(request):
如果request.method =='POST':
form = UserForm(request.POST,user = request.user )
如果form.is_valid():
#执行某些数据
pass
else:
form = UserForm(user = request.user)
#您的视图的其余部分遵循

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



这样做,你需要通过用户作为关键字参数。您可以通过 request.POST 作为位置参数或关键字参数(通过 data = request.POST ) 。


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 it should pass.

This is what I currently have which works great for creating new users, but if I want to edit a user I run into the problem of their email not validating, because it comes up as being taken already. If I could check that it's their email using request.user.email then I would be able to solve my problem, but I'm not sure how to do that.

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

解决方案

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).

这篇关于以Django形式获取请求数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆