2017-06-06 99 views
0

我遵循下面从现已解散的文档站点复制的示例。这个例子太好了 - 这里使用了两个密码字段。Django-禁用确认密码

我不想使用确认密码。我只想使用单个密码字段。有没有办法做到这一点?

更新

RegistrationForm在forms.py使用内置UserCreationForm。它包含两个密码字段。以电子邮件为主要登陆场


自定义用户模型

models.py:

from __future__ import unicode_literals 
from django.db import models 
from django.contrib.auth.models import (
     AbstractBaseUser, BaseUserManager, PermissionsMixin) 
from django.utils import timezone 
from django.utils.translation import ugettext_lazy as _ 


class UserManager(BaseUserManager): 
    def _create_user(self, email,password, is_staff, is_superuser, **extra_fields): 
     now = timezone.now() 
     if not email: 
      raise ValueError('users must have an email address') 
     email = self.normalize_email(email) 
     user = self.model(email = email, 
          is_staff = is_staff, 
          is_superuser = is_superuser, 
          last_login = now, 
          date_joined = now, 
          **extra_fields) 
     user.set_password(password) 
     user.save(using = self._db) 
     return user 

    def create_user(self, email, password=None, **extra_fields): 
     user = self._create_user(email, password, False, False, **extra_fields) 
     return user 

    def create_superuser(self, email, password, **extra_fields): 
     user = self._create_user(email, password, True, True, **extra_fields) 
     return user 

class User(AbstractBaseUser,PermissionsMixin): 
    """My own custom user class""" 

    email = models.EmailField(max_length=255, unique=True, db_index=True, verbose_name=_('email address')) 
    date_joined = models.DateTimeField(auto_now_add=True) 
    is_active = models.BooleanField(default=True) 
    is_staff = models.BooleanField(default=False) 

    objects = UserManager() 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = [] 

    class Meta: 
     verbose_name = _('user') 
     verbose_name_plural = _('users') 

    def get_full_name(self): 
    """Return the email.""" 
     return self.email 

    def get_short_name(self): 
    """Return the email.""" 
     return self.email 

forms.py:

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


class RegistrationForm(UserCreationForm): 
    email = forms.EmailField(widget=forms.TextInput(
     attrs={'class': 'form-control','type':'text','name': 'email'}), 
     label="Email") 
    password1 = forms.CharField(widget=forms.PasswordInput(
     attrs={'class':'form-control','type':'password', 'name':'password1'}), 
     label="Password") 
    password2 = forms.CharField(widget=forms.PasswordInput(
     attrs={'class':'form-control','type':'password', 'name': 'password2'}), 
     label="Password (again)") 

    '''added attributes so as to customise for styling, like bootstrap''' 
    class Meta: 
     model = User 
     fields = ['email','password1','password2'] 
     field_order = ['email','password1','password2'] 

    def clean(self): 
    """ 
    Verifies that the values entered into the password fields match 
    NOTE : errors here will appear in 'non_field_errors()' 
    """ 
     cleaned_data = super(RegistrationForm, self).clean() 
     if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data: 
      if self.cleaned_data['password1'] != self.cleaned_data['password2']: 
       raise forms.ValidationError("Passwords don't match. Please try again!") 
     return self.cleaned_data 

    def save(self, commit=True): 
     user = super(RegistrationForm,self).save(commit=False) 
     user.set_password(self.cleaned_data['password1']) 
     if commit: 
      user.save() 
     return user 

#The save(commit=False) tells Django to save the new record, but dont commit it to the database yet 

class AuthenticationForm(forms.Form): # Note: forms.Form NOT forms.ModelForm 
    email = forms.EmailField(widget=forms.TextInput(
     attrs={'class': 'form-control','type':'text','name': 'email','placeholder':'Email'}), 
     label='Email') 
    password = forms.CharField(widget=forms.PasswordInput(
     attrs={'class':'form-control','type':'password', 'name': 'password','placeholder':'Password'}), 
     label='Password') 

    class Meta: 
     fields = ['email', 'password'] 

views.py:

from django.shortcuts import redirect, render, HttpResponse 
from django.contrib.auth import login as django_login, logout as django_logout, authenticate as django_authenticate 
#importing as such so that it doesn't create a confusion with our methods and django's default methods 

from django.contrib.auth.decorators import login_required 
from .forms import AuthenticationForm, RegistrationForm 


def login(request): 
    if request.method == 'POST': 
     form = AuthenticationForm(data = request.POST) 
     if form.is_valid(): 
      email = request.POST['email'] 
      password = request.POST['password'] 
      user = django_authenticate(email=email, password=password) 
      if user is not None: 
       if user.is_active: 
        django_login(request,user) 
        return redirect('/dashboard') #user is redirected to dashboard 
    else: 
     form = AuthenticationForm() 

    return render(request,'login.html',{'form':form,}) 

def register(request): 
    if request.method == 'POST': 
     form = RegistrationForm(data = request.POST) 
     if form.is_valid(): 
      user = form.save() 
      u = django_authenticate(user.email = user, user.password = password) 
      django_login(request,u) 
      return redirect('/dashboard') 
    else: 
     form = RegistrationForm() 

    return render(request,'register.html',{'form':form,}) 

def logout(request): 
    django_logout(request) 
    return redirect('/') 

@login_required(login_url ="/") 
def dashboard(request): 
    return render(request, 'dashboard.html',{}) 

settings.py:

AUTH_USER_MODEL = 'myapp.User' 

admin.py

from django.contrib import admin 
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin 
from django.contrib.auth.models import Group 
from .models import User 


class UserAdmin(BaseUserAdmin): 
    list_display = ('email','is_staff') 
    list_filter = ('is_staff',) 
    fieldsets = ((None, 
        {'fields':('email','password')}), ('Permissions',{'fields':('is_staff',)}),) 
    add_fieldsets = ((None, {'classes': ('wide',), 'fields': ('email', 'password1', 'password2')}),) 
    search_fields =('email',) 
    ordering = ('email',) 
    filter_horizontal =() 

admin.site.register(User, UserAdmin) 
admin.site.unregister(Group) 

Extending or Substituting User Model - Custom user model with email as primary login field.摘录原作者是Rishabh Agrahari。可在contributor page上找到详情。信息来源根据CC BY-SA 3.0获得许可,可在Documentation archive中找到。参考主题ID:1209和例如ID:4050

+0

你为什么要这么做? –

+0

@DanielRoseman我正在开发一个项目,该项目在注册时只有一个密码输入字段,大多数用户只有一个密码输入字段。我喜欢上面的实现,所以我只是想使用它。 – PROTO

回答

0

如果删除字段密码2和清洁方法它会工作

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


class RegistrationForm(UserCreationForm): 
    email = forms.EmailField(widget=forms.TextInput(
     attrs={'class': 'form-control','type':'text','name': 'email'}), 
     label="Email") 
    password = forms.CharField(widget=forms.PasswordInput(
     attrs={'class':'form-control','type':'password', 'name':'password'}), 
     label="Password") 

    '''added attributes so as to customise for styling, like bootstrap''' 
    class Meta: 
     model = User 
     fields = ['email','password'] 
     field_order = ['email','password'] 

    def save(self, commit=True): 
     user = super(RegistrationForm,self).save(commit=False) 
     user.set_password(self.cleaned_data['password']) 
     if commit: 
      user.save() 
     return user 

admin.py

from django.contrib import admin 
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin 
from django.contrib.auth.models import Group 
from .models import User 


class UserAdmin(BaseUserAdmin): 
    list_display = ('email','is_staff') 
    list_filter = ('is_staff',) 
    fieldsets = ((None, 
        {'fields':('email','password')}), ('Permissions',{'fields':('is_staff',)}),) 
    add_fieldsets = ((None, {'classes': ('wide',), 'fields': ('email', 'password')}),) 
    search_fields =('email',) 
    ordering = ('email',) 
    filter_horizontal =() 
+0

不幸的是,它仍然不起作用。 – PROTO

+0

if form.is_valid():将为false。 – PROTO

+0

如果不注册您的代码,将无法帮到您 – user2021091

0

我有同样的问题(尽管有不同的基类),并通过将password2字段设置为None来修复它,这有效地移除了基类字段。

class RegistrationForm(UserCreationForm): 
    email = forms.EmailField(blah) 
    password1 = forms.CharField(blah) 
    password2 = None