将用户注册添加到 Django 应用程序

Adding User Registration to Django App

我正在学习并完成本教程:http://tutorial.djangogirls.org/en/django_forms/README.html

我想继续并在我所做的登录按钮旁边添加一个注册按钮,但我无法让它工作。我试着做 action = "{% url blog.views.register %}" 但我一直收到关于找不到参数的错误。我会 post 我所有的代码,但我几乎可以肯定它偏离了基础。我遵循了这个想法:http://tea.cesaroliveira.net/archives/460 但我无法让它正常工作。实施注册表单的最佳方式是什么?有人能给我一个例子或指南吗,即使只是一个简短的例子,也可以是我应该采取的添加注册功能的方法。我在 login.html 模板中添加了第二个表格 method=postaction = "{% url blog.views.register %}" 以及另一个注册模板 register.html

在blog/views.py

def register(request):
    if request.method == "POST":
        form = UserCreateForm(request.POST, instance=post)
    return render(request, 'blog/register.html)

并在 forms.py

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

class UserCreateForm(UserCreationForm):
    email = forms.EmailField(required=True)

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

并在 blog/urls.py

from django.conf.urls import patterns, include, url
from django.contrib import admin
from blog import views
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^accounts/login/$', 'django.contrib.auth.views.login'),
    url(r'^accounts/logout/$', 'django.contrib.auth.views.logout', {'next_page': '/'}),
    url(r'', include('blog.urls')),
    url(r'^accounts/register/$', views.register , {'next_page': '/'}),
)

至于验证,我稍后会担心,我只是想让它正常工作,以便他们可以单击“注册”并调出一个带有要填写的表格的注册模板。我不确定这是否需要新模型,因为 django 已经内置了用户功能。

任何 help/advice 将不胜感激。我只是想看看我的方法有什么问题以及更好的方法是什么。

好的,从头开始,这很可能是您的代码可能崩溃的第一个原因,这个 {% url blog.views.register %} 是错误的。根据 reverse urls 上的 Django 文档:

In order to perform URL reversing, you’ll need to use named URL patterns.

因此,要为注册视图创建反向 url,您的 url 模式应如下所示:

urlpatterns = patterns('',
    url(r'^accounts/register/$', views.register , name="register"),
)

我删除了 'next' 项,因为您可以从视图中重定向。在模板中,您输入:

{% url 'blog:register' %},左边的参数是应用名称,右边的​​参数是 url 模式的名称。

其次,我不确定您是如何处理登录表单的,但是注册视图需要一个不存在的实例。 Instance 在更新现有对象时使用。对于您的注册,这不是正在发生的事情,因此不需要在那里。

def register(request):
    if request.method == "POST":
        form = UserCreateForm(request.POST) # filled form/i'm skipping validation for this example
        return HttpResponseRedirect('/') # go to some other page if successfully saved
    else:
        form = UserCreateForm # if the user accessed the register url directly, just display the empty form
    return render(request, 'blog/register.html',  {'form': form})

但最终,我强烈推荐 django-allauth 给用户 registration/profile 东西。

更新:修复了寄存器的反向url。