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