【问题标题】:Django 1.4 Modifying Custom Account Model for Uniqueness of E-mail AddressesDjango 1.4 修改自定义帐户模型以实现电子邮件地址的唯一性
【发布时间】:2012-05-28 08:51:42
【问题描述】:

我已经定义了一个自定义用户帐户,该帐户利用了 auth User 模型中的几个内置项,并使用用户链接将这些与我在数据库上注册用户所需的一些附加字段链接起来。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

与我的models.py相关

# additional model to incorporate our custom fields to the auth user model                                                                                   
class Account(models.Model):
    user = models.OneToOneField(User)      #link (pointer) to the users other information in User model                                                      
    birthdate = models.DateField(blank = True, ) # True makes this field optional                                                                            
    gender = models.CharField(max_length = 1, choices = GENDER_CHOICE, null = True, blank = True)                                                                                    

    def __unicode__(self):            # define a unicode for the user to access                                                                              
        return u'%s %s' % (self.user.first_name, self.user.last_name)   # return first and last name in shell  


# custom form to gather information from the user for a new account                                                                                          
class UserRegistration(UserCreationForm):
#class RegistrationForm(forms.ModelForm):                                                                                                                    
    class Meta:
        model = User
        fields = ("first_name", "last_name", "email", "username", "password1", "password2",)

    # ensures uniqueness of user email addresses when registering                                                                                         
    def clean_email(self):
        print "In custom creation"
        email = self.cleaned_data.get(email = 'email')
        username = self.cleaned_data.get(username = 'username')
        # checks if email address already exists                                                                                                          
        if User.objects.filter(email__iexact = self.cleaned_data['email']):
            print "Email exists"
#           if email and User.objects.filter(email__iexact = email).exclude(username=username).exists():                                                     
                raise forms.ValidationError(u'Email Address is currently used by another user.')
        return email

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

与views.py相关

def Main(request):
    if request.user.is_authenticated():
        latest_events = Event.objects.all().order_by('-created')[:10] # Returns latest 10 events                                                              
        my_events = Event.objects.filter(creator=request.user)[:10]   # Returns up to 10 events created by current User                                       
        my_calendars = Calendar.objects.filter(creator=request.user)  # Returns all calendars created by the user                                             
        authForm = None
        loginForm = None
        headerType = "header.html"
    else:
        latest_events = None
        my_events = None
        my_calendars = None
        headerType = "header_main.html"

        authForm = UserRegistration(request.POST or None)
        print "Creating account UserRegistration" # TESTING PRINT                                                                                             
        print "User email = %s " %(User._meta.get_field('email'))
        if request.method == 'POST':
            if authForm.is_valid():
                newUser = authForm.save(commit=False)
                newUser.save()
                newUser = authenticate(username=request.POST['username'], password=request.POST['password1'])
                login(request, newUser)

                return HttpResponseRedirect('/signup/')
....
....
more code on success redirection
....
....

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(希望我没有贴太多代码,只是想彻底)

如您所见,我最近进行了一些已注释掉的尝试。我尝试通过下载“registration”来使用RegistrationFormUniqueForm() 中内置的你,但我实际上并不想制作新的注册表单,因为我已经有了一个工作表。

我继续尝试另一个建议,评论下的代码

# custom form to display additional sign up information

当我尝试使用已注册的电子邮件注册新用户时,它没有抛出任何错误并允许注册。我还尝试更改用户的电子邮件,它允许更改为已接收的电子邮件而没有异议。

任何人都可以建议一种方法,使用户注册保持对每个尝试使用可能已被占用的电子邮件地址注册的人的唯一锁定?以及防止他们将电子邮件更改为当前用户使用的电子邮件?

提前致谢。

编辑:我对模型注册表单 def clean_email() 和视图中的 def 进行了更改,以反映我目前仍然无法使用的内容。

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案1】:

    clean_email 方法的缩进对于这两种形式都是错误的。目前,它们是Meta 类的方法,因此永远不会被调用。例如,注册表应该是:

    class RegistrationForm(UserCreationForm):
    #class RegistrationForm(forms.ModelForm):                                                                                                                    
        class Meta:
            model = User
            fields = ("first_name", "last_name", "email", "username", "password1", "password2",)
    
        def clean_email(self):
            """ensures uniqueness of user email addresses when registering"""
            email = self.cleaned_data.get('email')
    

    这可能不是真正的问题——将代码粘贴到堆栈溢出时很容易出现缩进错误。如果是这样,我会删除答案。

    【讨论】:

    • 不,实际上就是这样。我想知道这一点,但从我读到的例子中,他们是如何发布它的,所以我想他们知道一些我可能不知道的东西。我会试试的,让你知道。谢谢
    • 我对代码缩进进行了更改,但输入已在使用的电子邮件地址仍然不会引发错误。任何人都可以就解决这个问题的方法提供任何想法吗?提前致谢。
    • 如果您更改了代码,请更新您的问题,使其完全相同。然后尝试添加一些打印语句或记录以尝试找出发生了什么。你认为应该调用 clean 方法吗?查询集是否包含它应该包含的项目。希望您能够发现问题。
    猜你喜欢
    • 2014-09-21
    • 1970-01-01
    • 2014-09-16
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多