2016-06-14 173 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登錄視圖,該視圖負責在表單驗證後進行登錄操作。