正确的方法来扩展django-registration RegisterForm类

时间:2012-05-08 22:05:42

标签: django django-forms django-registration

所以我有django regustration,我想扩展表单的版本以禁止已经使用电子邮件的注册 - 这是怎么做的?

我有这个(好吧,我真的没有。我的笔记本电脑已经被我的gf观看了hulu上的声音,所以这来自内存和我的ipad):

import django-registration.registrationForm

class customRegistrationForm(form.RegistrationForm):
    def clean_email(self):
        #check here like the one for username!

我可以这样做吗?另外,我应该在哪里贴这个自定义表格?我假设我没有把它与django-registration文件夹,所以在我的应用程序文件夹...我“意味着”把它放在一个特定的文件夹?如果我只是将它粘贴在基础app_name文件夹中并且调用是customRegistrationForm?

,这是否重要?

干杯! 安德鲁

更新

好的,所以我已经解决了“覆盖”django中的问题,我需要将这些类放在 init .py中,如果我想要一个子文件夹被选中,它需要自己的 init .py文件

“文件夹” init .py文件可以为空

不知道为什么会这样,大概是python的东西?另外,不确定我是否可以在文件夹中的单独文件中使用customRegisterForm.py,或者 需要 init .py

无论如何,接下来是覆盖似乎不起作用我的假设。

在Java中,当我扩展一个类时,可以访问任何和所有类非私有成员,并且行为与在父类中定义的完全相同。 在django,我得到了很多

  

'customRegistrationForm'对象没有属性'get_form_class'

或我没有明确创建的方法的名称...我是否在覆盖中遗漏了什么?

更新更新

我从

复制了第二个例子
  

http://pbjots.blogspot.com/2012/01/customising-django-registration-no.html

这是一种享受。仍然不确定为什么扩展不会保留所有这些方法,或者如果我只是通过盲目地复制代码打破某些想法? -

2 个答案:

答案 0 :(得分:1)

要扩展注册表单以包含电子邮件,您首先要扩展 UserCreationForm 以包含电子邮件字段。您可以创建一个名为forms.py的文件,以包含该特定应用所需的所有表单,但根据我的经验,您通常不必使用 init.py

以下是如何扩展注册表单以包含电子邮件的示例:

from django.contrib.auth.forms import UserCreationForm
from django import forms
from django.contrib.auth.models import User

class RegisterForm(UserCreationForm):
    email = forms.EmailField(label="E-Mail")    

    class Meta:
        model = User
        fields = ("username", "email", )

    def clean_email(self):
        email = self.cleaned_data["email"]

        try:
        User.objects.get(email=email)
        except User.DoesNotExist:
        return email

        raise forms.ValidationError("A user with that email address already exists.")

查看这个Django教程,它很好地概述了这个过程。 https://docs.djangoproject.com/en/1.4/intro/tutorial01/

答案 1 :(得分:1)

查看 RegistrationFormUniqueEmail 表单。它是一个来自django-registration的内置类,可以完成工作

from registration.forms import RegistrationFormUniqueEmail