• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
不哭不闹,不吵不笑
博客园    首页    新随笔    联系   管理    订阅  订阅

以Django形式获取请求数据 转自::::https://gxnotes.com/article/96012.html

问题描述

可以在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)
        if len(test)>0:
            raise ValidationError("A user with that email already exists.")
        else:
            return 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')
        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)。

 

次佳解决方案

以下是使用通用视图时将用户置于表单中的方法:

在视图中,将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

 

第三种解决方案

就这样你知道,使用Django 1.4和通用类的CreateView和UpdateView,每个模型窗体都会填充一个self.instance,这样可以比较POSTed的邮件和当前的用户邮箱。

这是一个代码示例,使用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
posted @ 2017-08-24 14:53  不哭不闹,不吵不笑  阅读(198)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3