我想要注册表格并检查是否 通过检查数据库,用户的电子邮件是新的。
但问题是我不知道如何制作它。 我尝试使用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():
我很困惑这样做。 我正在等待帮助提前谢谢;)
答案 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()
的股票实施将处理此问题。