Django注册和登录 - 通过示例解释

时间:2013-06-03 17:00:32

标签: django forms authentication login registration

有人可以尽可能简单地解释如何进行注册身份验证吗?我使用django.contrib.auth进行了身份验证(登录),但我想要的是一个完整的注册(社交/非)+登录。已经看过django-allauthdjango-social-authdjango-social,但仍然无法在没有黑客攻击的情况下使用它。听说django-registrationdjango-profiles可以让它变得更容易,但我无法处理它。例如,

~/.virtualenvs/plinter/lib/python2.7/site-packages/registration/backends/default/urls.py

需要一个小黑客才能工作:

# from django.views.generic.simple import direct_to_template
from django.views.generic import RedirectView
...
                           RedirectView.as_view(url='/registration/activation_complete.html'),
                           # direct_to_template,
                           # {'template': 'registration/activation_complete.html'},
...

DjangoBook给出了{i>简单 Contact and search forms的例子。但我无法扩展用户注册和登录。 那么,任何人都可以举例说明工作 注册登录吗?

更新

Here是一个简单的登录示例。现在考虑django-allauth或社会认可或registration2 ......

UPDATE2

django-allauth似乎是更轻松验证的最佳解决方案。在设置中添加正确的应用程序,注册fb / google / etc应用程序并通过管理员注册并使用模板继承来更改默认页面设计。

2 个答案:

答案 0 :(得分:13)

THIS是一个关于登录&的非常好的教程。它很好地解释了如何通过自己的广告覆盖现有的django登录页面来执行登录。

更新:

此处注册和登录概述。有关详细信息,请转到链接。

注册:

  

观看次数和网址

     

转到较低的站点文件夹(settings.py文件所在的位置)并打开   views.py文件。在顶部确保以下导入   包括在内。如果没有,请添加它们:

from django.shortcuts import
 render_to_response from django.http import HttpResponseRedirect from
 django.contrib.auth.forms import UserCreationForm from
 django.core.context_processors import csrf
     

在下面添加以下功能(你可以把它们放在后面   登录功能):

 def
 register(request):
     if request.method == 'POST':
         form = UserCreationForm(request.POST)
         if form.is_valid():
             form.save()
             return HttpResponseRedirect('/accounts/register/complete')

     else:
         form = UserCreationForm()
     token = {}
     token.update(csrf(request))
     token['form'] = form

     return render_to_response('registration/registration_form.html', token)

 def registration_complete(request):
     return render_to_response('registration/registration_complete.html')
     

打开站点文件夹中的urls.py文件(与...相同的文件夹)   settings.py)。在urlpatterns = patterns(''下面,插入以下内容   线。

     # Registration URLs
     url(r'^accounts/register/$', 'simplesite.views.register', name='register'),
     url(r'^accounts/register/complete/$', 'simplesite.views.registration_complete',
 name='registration_complete'),
     

模板我们假设您的网站已有模板   目录和带导航栏的base.html文件。打开   base.html文件并在nav元素中添加导航菜单链接   登录页面

<a href="/accounts/register">register</a>
     

如果尚不存在,请转到模板文件夹并创建   其中的一个文件夹名为registration。创建一个名为的文件   registration_form.html,将其保存到模板/注册文件夹,   然后使用以下内容填充它:

{% extends "base.html" %} {% block title %}Register{%
 endblock %} {% block content %}

   <h2>Registration</h2>

   <form action="/accounts/register/" method="post">{% csrf_token %}
     {{form.as_p}}   <input type="submit" value="Register" />

   </form>

 {% endblock %}
     

创建一个名为registration_complete.html的文件,将其保存到   模板/注册文件夹,并使用以下内容填充它:

{% extends "base.html" %} {% block title %}You are
 Registered{% endblock %} {% block content %}

   <h2>Thank you for Registering</h2>   <p><a
 href="/accounts/login/">Please Login</a></p>

 {% endblock %}

登录:

  

视图和网址打开下方站点文件夹(settings.py文件所在的位置)中的views.py文件。如果没有,那么创建和   保存。在文件的顶部插入以下导入:from   django.shortcuts import render_to_response下面你只需要   添加一个渲染登录页面的函数。其他功能   (登录和注销)位于Django Auth文件夹的views.py文件中。

def loggedin(request):
    return render_to_response('registration/loggedin.html')
     

#或者,如果您想在登录时显示其用户名,请在视图中调用其用户名。将登录功能更改为:

def loggedin(request):
    return render_to_response('registration/loggedin.html',
                              {'username': request.user.username})
     

打开站点文件夹中的urls.py文件(与settings.py相同的文件夹)。   在urlpatterns = patterns(''下面,插入以下行。

# Auth-related URLs:
url(r'^accounts/login/$', 'django.contrib.auth.views.login', name='login'),
url(r'^accounts/logout/$', 'django.contrib.auth.views.logout', name='logout'),
url(r'^accounts/loggedin/$', 'simplesite.views.loggedin', name='loggedin'),
     

simplesite是保存views.py的文件夹的名称   您正在呼叫的文件。打开settings.py文件并在底部   插入LOGIN_REDIRECT_URL = '/accounts/loggedin/'。 Django的默认值   是在登录时重定向到/ accounts / profile,这很好   您在该网址上有个人资料页面。如果不是,你需要改变你的   登录重定向网址的设置默认为持有您的   loggedin.html page。

     

<强>模板

     

我们假设您的网站已经有一个模板目录和一个   带有导航栏的base.html文件。打开base.html文件并进入   nav元素添加导航菜单链接到登录页面<a href="/accounts/login">login</a>同时添加注销链接<a href="/accounts/logout">logout</a>创建一个名为的目录   在templates文件夹中注册。如果你通过这样做   命令行,输入mkdir registration创建一个名为login.html的文件,   将其保存到模板/注册文件夹,并使用   以下内容:

{% extends "base.html" %}
{% block title %}Log In{% endblock %}
{% block content %}

<form method="post" action="{% url 'django.contrib.auth.views.login' %}">
{% csrf_token %}
<table>
  {{ form.as_table }}
</table>

<input type="submit" value="login" />
</form>

{% endblock %}
     

{{ form.as_table }}使用Django Forms模块创建表单。   您可以使用{{ form }}创建未格式化的表单   HTML表格标签,或将每个字段放在带有{{ form.as_p }}的段落标记内,或作为无序列表{{ form.as_ul }}。或者,你   也可以布局自己的表单结构并使用表单字段标记   如下:

{% extends "base.html" %}
{% block title %}Log In{% endblock %}
{% block content %}

<form method="post" action="{% url 'django.contrib.auth.views.login' %}">
{% csrf_token %}

{% if form.errors %}
<p>Your Username or Password were not entered correctly. Please try again.</p>
{% endif %}

<table>
<tr>
    <td>{{ form.username.label_tag }}</td>
    <td>{{ form.username }}</td>
    <td>{{ form.username.errors }}</td> 
</tr>
<tr>
    <td>{{ form.password.label_tag }}</td>
    <td>{{ form.password }}</td>
    <td>{{ form.password.errors }}</td>
</tr>
</table>

<input type="submit" value="login" />
</form>

{% endblock %}
     

创建一个名为loggedin.html的文件,将其保存到   模板/注册文件夹,并使用以下内容填充它:

{% extends "base.html" %}
{% block title %}Logged In{% endblock %}
{% block content %}

  <h2>You are logged in</h2>

{% endblock %}
     

如果要显示用户名,可以进行调整   视图部分讨论的视图。然后更改loggedin.html   模板如下(改变你认为合适的措辞):

{% extends "base.html" %}
{% block title %}Logged In{% endblock %}
{% block content %}

<h1>Welcome {{username}}</h1>
<p>Thank you for logging in.</p>
<p><a href="/accounts/logout/">Logout</a></p>

{% endblock %}
     

创建一个名为logged_out.html的文件,将其保存到   模板/注册文件夹,并使用以下内容填充它:

{% extends "base.html" %}
{% block title %}Logged Out{% endblock %}
{% block content %}

  <h2>Logged out!</h2>
  <p><a href="/accounts/login/">Log back in</a></p>

{% endblock %}

答案 1 :(得分:0)

Trix的方法对我有用,但是注销链接重定向到管理员注销,而不是login_out.html。

要修复重定向,我在href中添加了下一个选项:

<a href="{% url 'logout' %}?next={% url 'loggedout' %}">Logout</a>

在模板/注册中:

logged_out.html重命名为loggedout.html;下划线导致它仍然路由到管理员注销页面。

在views.py中:

def loggedout(request):
    return render_to_response('registration/loggedout.html')

最后,在urls.py中:

url(r'^myapp/loggedout/$', 'myapp.views.loggedout', name='loggedout'),