在Django中注册用户的最佳方式

时间:2010-08-19 16:05:16

标签: django django-models django-forms

我正在尝试为我的Django应用实现用户注册。我读过的那本书提到了UserCreationForm,但我需要的不仅仅是名称,密码和电子邮件地址。我可以实现自己的用户对象并使用ModelForm,但后来我失去了一些django方便的身份验证。最后,我读了一些关于UserProfiles的内容,这些内容补充了我猜的用户,所以我想我需要所有这些东西的组合。这是我到目前为止所拥有的。

查看 - 这很简单。我想在这里做的就是创建我的表单并保存用户

def main(request):
    rform1 = forms.RegisterForm1()
    rform2 = forms.RegisterForm2()
    return render_to_response("authentication/index.html", {'form1': rform1, 'form2':rform2})

def register(request):
    if request.method == 'POST':
        rform1 = forms.RegisterForm1(request.POST)
        rform2 = forms.RegisterForm2(request.POST)
        if rform1.is_valid() and rform2.is_valid():
            new_user = rform1.save()
            return HttpResponseRedirect("/register-success/")
    return render_to_response("authentication/index.html", {'form1': rform1,'form2':rform2})

表单 - 这是我创建用户的表单。或至少开始

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

class RegisterForm2(forms.ModelForm):
    class Meta:
        model = UserProfile

模型 - 这是我的UserProfile,我想补充用户。

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    phonenumber = PhoneNumberField()

我正在尝试做什么?我是在正确的轨道上

2 个答案:

答案 0 :(得分:31)

制作两个模型表单,一个用于User模型,另一个用于UserProfile模型。

class UserForm(django.forms.ModelForm):
    class Meta:
        model = User  

class UserProfileForm(django.forms.ModelForm):
    class Meta:
        model = UserProfile
        exclude = ['user']

为它们添加前缀并在同一HTML表单元素中一起显示它们。在视图中,在保存用户和UserProfile之前检查两者是否有效。

def register(request):
    if request.method == 'POST':
        uf = UserForm(request.POST, prefix='user')
        upf = UserProfileForm(request.POST, prefix='userprofile')
        if uf.is_valid() * upf.is_valid():
            user = uf.save()
            userprofile = upf.save(commit=False)
            userprofile.user = user
            userprofile.save()
            return django.http.HttpResponseRedirect(…something…)
    else:
        uf = UserForm(prefix='user')
        upf = UserProfileForm(prefix='userprofile')
    return django.shortcuts.render_to_response('register.html', 
                                               dict(userform=uf,
                                                    userprofileform=upf),
                                               context_instance=django.template.RequestContext(request))

register.html

<form method="POST" action="">
    {% csrf_token %}
    {{userform}}
    {{userprofileform}}
    <input type="submit">
</form>

答案 1 :(得分:28)

我只是在研究这个问题,并发现Django有一个非常简单的内置新用户创建表单,如果你想要简单注册就可以使用 - 没有选项,例如保存电子邮件地址和验证它,所以它不适用于OP的用例,但我发布在这里,以防其他人像我一样遇到这个问题,并且正在寻找简单的东西。

如果您只是希望人们能够选择用户名和密码,那么内置插件将为您完成所有操作,包括验证并保存新用户:

from django.views.generic.edit import CreateView
from django.contrib.auth.forms import UserCreationForm

urlpatterns = patterns('',
    url('^register/', CreateView.as_view(
            template_name='register.html',
            form_class=UserCreationForm,
            success_url='/'
    )),
    url('^accounts/', include('django.contrib.auth.urls')),

    # rest of your URLs as normal
)

所以你唯一需要做的就是创建 register.html ...

此处有更多信息:http://www.obeythetestinggoat.com/using-the-built-in-views-and-forms-for-new-user-registration-in-django.html