Django:如何编写用户注册模型的代码

时间:2014-04-22 08:06:01

标签: django validation registration modelform

我想要注册表格并检查是否 通过检查数据库,用户的电子邮件是新的。

但问题是我不知道如何制作它。 我尝试使用unique = True to Field和clean_email()方法。

我有两个问题。

1)当ValidationError发生在unique = True的步骤时, 我怎么能抓到那个错误?我应该覆盖clean_field()方法 模特?我怎么能做到?

2)我怎样才能为这个注册应用编写高效而优秀的代码?

以下是我制作的源代码。

# models.py
from django.db import models

class User(models.Model):
    university = models.ForeignKey('University')
    mail = models.EmailField(unique=True)
    password = models.CharField()
    nickname = models.CharField()


class University(models.Model):
    name = models.CharField()
    mail = models.CharField()


from django.forms import ModelForm

class LoginForm(ModelForm):
    class Meta:
        model = User
        fields = ('mail', 'password')

class RegisterForm(ModelForm):
    class Meta:
        model = User

    def clean_mail(): 
        data = self.cleaned_data['mail']
        if User.objects.filter(mail=data).exists():
            raise forms.ValidationError("This email is already exists")

# views.py

def register(request):
    if request.method == 'POST':
        ###
        if form.is_valid():

我很困惑这样做。 我正在等待帮助提前谢谢;)

3 个答案:

答案 0 :(得分:1)

你没有发现那个错误。 Django为你做到了:当你调用form.is_valid()时,它调用每个clean_field方法并捕获任何ValidationError异常,将它们放入form.errors属性。

所以,你拥有的已经很好了。

除了你永远不应该以纯文本存储密码的主要,巨大,绝对重要的问题。不要创建自己的独立用户类:从AbstractBaseUser继承并使用Django的内置方法来创建用户并散列他们的密码。你不能这样做。

答案 1 :(得分:1)

首先,如果未引发错误,您的 clean_mail()应返回self.cleaned_data ['mail'] 。虽然这里不需要clean_mail

其次,如果在模型中设置unique = Ture,Django 将自动检查电子邮件的唯一性。如果它不是唯一的,则会引发错误。 您可以通过在ModelForm的Meta选项中提供它来覆盖唯一的错误文本。

e.g。

class RegisterForm(ModelForm):
    class Meta:
        model = User
        error_messages = {
            'mail': {
                'unique': _("This email already exists"),
            },
        }

注意:django v1.6中仅添加了error_messages选项... 对于以前的版本:

您可以直接在ModelForm中覆盖现场邮件。例如,在ModelForm顶部定义

class RegisterForm(ModelForm):
    mail = forms.EmailField(max_length=255, error_messages = { 'unique': 'xyz....',})
    class Meta:.......

你可以在这里找到参考:https://docs.djangoproject.com/en/1.5/ref/forms/fields/#error-messages

答案 2 :(得分:0)

快速浏览以下页面:https://docs.djangoproject.com/en/dev/ref/models/instances/

部分"验证对象"指导您完成模型验证中的步骤。

如果您需要User.mail上的单列唯一性,只需将关键字unique=True添加到Charfield即可。 validate_unique()的股票实施将处理此问题。