2017-06-06 10 views
0

以下の例は、現在は存在しないドキュメントサイトからコピーされています。この例はあまりにも優れています。ここでは2つのパスワードフィールドが使用されています。Django-パスワードの確認を無効にする

パスワードの確認は使用しません。私は単一のパスワードフィールドを使いたいだけです。それを行う方法はありますか? forms.pyで

更新

RegistrationFormは作り付けのUserCreationFormを使用しています。 2つのパスワードフィールドが含まれています。


電子メールでのカスタム・ユーザー・モデルプライマリログインフィールドとして

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:原作者はRishabh AgrahariExtending or Substituting User Model - Custom user model with email as primary login field.から抜粋

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) 

。アトリビューションの詳細はcontributor pageにあります。ソースはCC BY-SA 3.0でライセンスされており、Documentation archiveにあります。リファレンストピックID:1209例ID:4050

+0

なぜあなたはそれを望みますか? –

+0

@DanielRoseman登録時に1つのパスワード入力フィールドと、1つのパスワード入力フィールドのような多数のユーザーを持つプロジェクトに取り組んでいます。上記の実装が好きなので、私はそれを使用することを考えました。 – 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フィールドを設定することによってそれを修正しました。

class RegistrationForm(UserCreationForm): 
    email = forms.EmailField(blah) 
    password1 = forms.CharField(blah) 
    password2 = None 
関連する問題