2016-06-14 175 views
0

我想创建一个注册和登录系统我已经做了注册表单,但我无法执行它的认证部分。如何使用django制作注册和登录系统?

Models.py

from __future__ import unicode_literals 
from django.db import models 


class profile(models.Model): 
    WORK = (
      ('School', 'School'), 
      ('Collage', 'Collage'), 
      ('Job', 'Job') 
     ) 
    name = models.CharField(max_length=150) 
    email = models.EmailField(max_length=254) 
    username = models.CharField(max_length=100, unique=True) 
    password = models.CharField(max_length=80) 
    age = models.IntegerField() 
    work = models.CharField(max_length=10, choices=WORK) 


    def __unicode__(self): 
     return self.username 

Forms.py对于用户的注册

from django import forms 
from .models import profile 



class registration_form(forms.ModelForm): 
    class Meta: 
     model = Post 
     fields={ 
     "name", 
     "email", 
     "username", 
     "password", 
     "work", 
     "age" 
     } 

我想用上面的数据库用户我该怎么办认证?(我也不想使用任何第三方库,如Django注册)

+4

你看过django.contrib.auth了吗?提供通用的构建模块来完成您想要的任务,并防止您将密码以纯文本形式存储在数据库中... – Jieter

+0

Yaa但它带来了django管理员的作用,并且比我想要的字段少很多 – Rasik

+3

**不要像这样推出自己的认证系统,这是不安全的**。您不应该将密码作为纯文本存储。 Django验证应用程序允许您使用额外的字段创建[自定义用户](https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#specifying-a-custom-user-model)。您可以在不启用管理员的情况下使用auth应用程序 - 它们是独立的应用程序。 – Alasdair

回答

3

@Alasdair是对的,你不需要django.contrib.admin就可以使用django.contrib.auth。

接下来是一个解决方案,它使用基于django泛型类的视图。

models.py

from django.db import models 
from django.contrib.auth.models import AbstractUser 

class Profile(AbstractUser): 
    WORK = (
     ('School', 'School'), 
     ('Collage', 'Collage'), 
     ('Job', 'Job') 
    ) 
                 ) 
    age = models.IntegerField() 
    work = models.CharField(max_length=10, choices=WORK) 

settings.py

AUTH_USER_MODEL = 'my_users_app.Profile' 
LOGIN_URL = '/login/' # Where our login page is 

views.py

from django.contrib.auth.forms import UserCreationForm, AuthenticationForm 
from django.contrib.auth.views import login as django_login_view 
from django.views.generic import FormView 


class LoginView(FormView): 
    form_class = AuthenticationForm 
    template_name = 'my_users_app/login.html' 

    def form_valid(self, form): 
     usuario = form.get_user() 

     django_login_view(self.request, usuario) 
     return super(LoginView, self).form_valid(form) 

urls.py

from my_users_app.views import LoginView 
urlpatterns = [ 
    url(r'^login/$', LoginView.as_view(), name='login'), 
] 

的login.html

<form method="post" autocomplete="off"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <button type="submit">Login</button> 
</form> 

注:

  • 为了使自己的用户模型,则需要配置AUTH_USER_MODEL,并继承从AbstractUser
  • AuthenticationForm将验证用户名/密码并将触发form_valid。
  • 我使用from django.contrib.auth.views import login来导入django登录视图,该视图负责在表单验证后进行登录操作。