2016-09-19 132 views
0

因此,一切工作正常,但我不能通過管理員添加權限給我的用戶。 當我更改用戶時,具有用戶權限的框出現在位,但我添加的所有權限都不起作用。當我以該用戶身份登錄時,我無權執行任何操作。自定義用戶模型權限

When I try to change an user

這是我在 「accounts.models」:

from django.utils import timezone 
from django.db import models 
from django.contrib.auth.models import PermissionsMixin 
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager 
from django.core.mail import send_mail 
from django.utils.translation import ugettext_lazy as _ 
from django.utils.http import urlquote 

class CustomUserManager(BaseUserManager): 
    def _create_user(self, email, password, is_staff, is_superuser, **extra_fields): 
    now = timezone.now() 

    if not email: 
     raise ValueError('The given email must be set') 

    email= self.normalize_email(email) 
    user = self.model(
      email=email, 
      is_staff=is_staff, is_active=True, 
      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): 
     return self._create_user(email, password, False, False, **extra_fields) 

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

class CustomUser(AbstractBaseUser, PermissionsMixin): 
    username = models.CharField(max_length=30) 
    email = models.EmailField(unique=True) 
    date_joined = models.DateTimeField(_('date joined')) 
    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=False) 
    is_staff = models.BooleanField(default=False) 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['username'] 

    objects = CustomUserManager() 

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

    def get_absolute_url(self): 
     return "https://stackoverflow.com/users/%s/" % urlquote(self.email) 
    def get_full_name(self): 
     return self.username 
    def get_short_name(self): 
     return self.username 
    def email_user(self, subject, message, from_email=None): 
     send_mail(subject, message, from_email, [self.email]) 

這是我在 「accounts.admin」:

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 .models import CustomUser 


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 = CustomUser 
     fields = ('email',) 

    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(UserCreationForm, self).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 = CustomUser 
     fields = ('email', 'password', 'is_active') 
    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', 'username', 'is_staff', 'is_active', 'last_login', 'date_joined') 
    list_filter = ('is_staff', 'is_active') 
    fieldsets = (
     (None, {'fields': ('email', 'password', 'is_active')}), 
     ('Permissions', {'fields': ('is_staff', 'groups', 'user_permissions')}), 
    ) 
    # 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', 'username') 
    ordering = ('email',) 

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

enter image description here

回答

2

請檢查你的db,你的UserID是否爲m apped with「auth_user_groups」表。

例如:

ID:2155 USER_ID:2447276 GROUP_ID:45

+0

我不太確定如何做到這一點,我添加了表格的圖像,我使用postgresql –

1

我已經重做跟隨這article自定義的用戶模型,現在它按預期工作。