2017-09-11 11 views
0

ドキュメントを使用しているユーザーを認証するために電子メールとパスワードのみを使用できるようにカスタム認証モデルを作成しようとしています。カスタムユーザー認証を使用して管理パネルを編集する

私はそれをやっているにもかかわらず、私は管理パネルを編集することに問題があります。特に、編集フォームを編集することができます。 私のコードは次のとおりです。

admin.py: 
from django import forms 
from django.contrib import admin 
from django.contrib.auth.models import Group 
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin 
from django.contrib.auth.forms import ReadOnlyPasswordHashField 

from registration.models import MyUser 


class UserCreationForm(forms.ModelForm): 
    """A form for creating new users. Includes all the required 
    fields, plus a repeated password.""" 
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput) 
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput) 

    class Meta: 
     model = MyUser 
     fields = ('email','is_active','is_hr','is_candidate','is_employee','company','first_name','last_name') 

    def clean_password2(self): 
     # Check that the two password entries match 
     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 
     if password1 and password2 and password1 != password2: 
      raise forms.ValidationError("Passwords don't match") 
     return password2 

    def save(self, commit=True): 
     # Save the provided password in hashed format 
     user = super().save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 


class UserChangeForm(forms.ModelForm): 
    """A form for updating users. Includes all the fields on 
    the user, but replaces the password field with admin's 
    password hash display field. 
    """ 
    password = ReadOnlyPasswordHashField() 

    class Meta: 
     model = MyUser 
     fields = ('email', 'password', 'is_active', 'is_admin','is_hr','is_candidate','is_employee','company','first_name','last_name') 

    def clean_password(self): 
     # Regardless of what the user provides, return the initial value. 
     # This is done here, rather than on the field, because the 
     # field does not have access to the initial value 
     return self.initial["password"] 


class UserAdmin(BaseUserAdmin): 
    # The forms to add and change user instances 
    form = UserChangeForm 
    add_form = UserCreationForm 

    # The fields to be used in displaying the User model. 
    # These override the definitions on the base UserAdmin 
    # that reference specific fields on auth.User. 
    list_display = ('email', 'is_admin','is_active', 'is_admin','is_hr','is_candidate','is_employee','company','first_name','last_name') 
    list_filter = ('is_admin',) 
    fieldsets = (
     (None, {'fields': ('email', 'password')}), 
     ('Permissions', {'fields': ('is_admin',)}), 
    ) 
    # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin 
    # overrides get_fieldsets to use this attribute when creating a user. 
    add_fieldsets = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('email', 'password1', 'password2')} 
     ), 
    ) 
    search_fields = ('email',) 
    ordering = ('email',) 
    filter_horizontal =() 

# Now register the new UserAdmin... 
admin.site.register(MyUser, UserAdmin) 
# ... and, since we're not using Django's built-in permissions, 
# unregister the Group model from admin. 
admin.site.unregister(Group) 

model.py:

from django.db import models 
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser 
) 


class MyUserManager(BaseUserManager): 
    def create_Euser(self, email): 
     """ 
     Creates and saves a User with the given email, 
     """ 
     if not email: 
      raise ValueError('Users must have an email address') 

     user = self.model(
      email=self.normalize_email(email) 
     ) 

     user.save(using=self._db) 
     return user 

    def create_user(self, email, password=None): 
     """ 
     Creates and saves a User with the given email, date of 
     birth and password. 
     """ 
     if not email: 
      raise ValueError('Users must have an email address') 

     user = self.model(
      email=self.normalize_email(email) 
     ) 

     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, email, password): 
     """ 
     Creates and saves a superuser with the given email, date of 
     birth and password. 
     """ 
     user = self.create_user(
      email, 
      password=password, 
     ) 
     user.is_admin = True 
     user.save(using=self._db) 
     return user 


class MyUser(AbstractBaseUser): 
    email = models.EmailField(
     verbose_name='email address', 
     max_length=255, 
     unique=True, 
    ) 
    first_name= models.CharField(max_length=150, default='') 
    last_name= models.CharField(max_length=150, default='') 
    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=False) 
    is_hr = models.BooleanField(default=False) 
    is_candidate = models.BooleanField(default=False) 
    is_employee = models.BooleanField(default=False) 
    company = models.CharField(max_length=100, default='') 

    objects = MyUserManager() 

    USERNAME_FIELD = 'email' 

    def __str__(self): 
     return self.email 

    def has_perm(self, perm, obj=None): 
     "Does the user have a specific permission?" 
     # Simplest possible answer: Yes, always 
     return True 

    def has_module_perms(self, app_label): 
     "Does the user have permissions to view the app `app_label`?" 
     # Simplest possible answer: Yes, always 
     return True 

    def get_short_name(self): 
     # The user is identified by their email address 
     return self.email 

    @property 
    def is_staff(self): 
     "Is the user a member of staff?" 
     # Simplest possible answer: All admins are staff 
     return self.is_admin 

答えて

0

あなたはUserAdminfieldsetsにフィールドを追加する必要がありますすべてのあなたのモデルfields.forを追加することができます。以下のようにあなたfieldsets

変更:変更の上

fieldsets = (
     (None, {'fields': ('email', 'password','company','first_name','last_name')}), 
     ('Permissions', {'fields': ('is_admin','is_active','is_hr','is_candidate','is_employee')}), 
    ) 

は、管理者がDjangoのためにフィールドを追加します。

関連する問題