Django - 如何将电子邮件添加到所需的东西

时间:2013-01-11 23:19:13

标签: django django-forms django-views

我创建了注册表单:

#urls.py
from django.conf.urls import patterns, url
from django.views.generic import TemplateView
from account.views import Register

urlpatterns = patterns('',
    url(r'^register/$', Register.as_view(template_name='account/register.html')),
)

#views.py
from django.views.generic import CreateView
from django.contrib.auth.models import User

class Register(CreateView):
    model = User
    success_url = '/account/'

我有疑问:如何添加该电子邮件是必需的(现在我只能输入用户名,密码和2倍的时间)。

@edit
以及如何“修复”密码?当我创建用户(以这种形式)然后转到管理面板时,在用户i中看到“无效的密码格式或未知的散列算法。”。我怎么修这个?

2 个答案:

答案 0 :(得分:2)

不需要电子邮件的原因是因为您使用的是ModelForm,它会从基础User模型中获取大量提示。具体而言,模型的required=True字段中不存在email属性。

一种解决方案是使用必要的属性创建自己的表单,可能使用ModelForm并添加所需的电子邮件字段。

另一种解决方案,也许是更好的解决方案,就是使用Aamir Adnan在您的问题评论中提到的django-registration之类的内容。它会为你简化很多事情。

repair password而言,您无法像使用CreateView那样将密码设置为原始字符串值。要设置密码,您必须致电user.set_password(raw_string),它将为您处理散列和腌制。看看内置UserCreationForm是如何工作的,如果您决定自己构建表单,而不是使用库(您不应该),请尝试模仿它。

答案 1 :(得分:0)

要解决这两个问题,您可以使用以下形式:

class UserCreationForm(forms.ModelForm):    
    class Meta:
        model = User

    def __init__(self, *args, **kwargs):
        super(UserCreationForm).__init__(*args, **kwargs)
        self.fields['email'].required = True

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password"])
        if commit:
            user.save()
        return user

class Register(CreateView):
    model = User
    form_class = UserCreationForm
    success_url = '/account/'

但是还会出现其他问题,例如重复用户名。