2017-10-22 2 views
1

Leute,Django erstellen CustomUser Modell

Ich versuche, mein eigenes User-Modell zu erstellen, indem das AbstractBaseUser Modell von Django bereitgestellt erstreckt.

Allerdings halte ich die folgende Fehlermeldung auf dem Erhalten Sie bei der Migration: ValueError: The field admin.LogEntry.user was declared with a lazy reference to '<app_name>.user', but app '<app_name>' doesn't provide model 'user'.

Was ich bisher getan haben, ist die folgende:

In app/models.py hinzugefügt CustomUser Klasse zusammen mit CustomUserManager mit relevanten Felder und alle.

In app/admin.py ich hinzugefügt habe dies:

from django.contrib.auth import get_user_model 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.forms import UserCreationForm, UserChangeForm 

from <app_name>.models import CustomUser 


class CustomUserChangeForm(UserChangeForm): 

    class Meta: 
     model = get_user_model() 
     fields = ('email',) 

class CustomUserCreationForm(UserCreationForm): 

    class Meta: 
     model = get_user_model() 
     fields = ('email',) 

    def clean_username(self): 
     username = self.cleaned_data["username"] 
     try: 
      get_user_model().objects.get(username=username) 
     except get_user_model().DoesNotExist: 
      return username 
     raise forms.ValidationError(self.error_messages['duplicate_username']) 

class CustomUserAdmin(UserAdmin): 
    form = CustomUserChangeForm 
    add_form = CustomUserCreationForm 
    fieldsets = (
     (None, {'fields': [('username', 'password'),]}), 
     (('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), 
     (('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 
            'groups', 'user_permissions')}), 
     (('Important dates'), {'fields': ('last_login', 'date_joined')}), 
     ) 

admin.site.register(CustomUser, CustomUserAdmin) 

von Apart, dass es diese

AUTH_USER_MODEL = '<app_name>.CustomUser' 

Alles zu seetings.py hinzugefügt, die ich bisher gefunden deutet darauf hin, dass die oben angegebenen Code dies machen sollte Arbeit, aber es tut es nicht. Ich habe schon 4-5 Stunden verbracht und kann mich immer noch nicht darum kümmern. Jemand bitte helfen

+0

Versucht dies? https://code.djangoproject.com/ticket/22563 – rajkris

Antwort

1

Erstellen Sie Ihre User-Modell wie folgt:

from django.core import validators 
from django.utils.translation import ugettext_lazy as _ 
from django.contrib.auth.models import AbstractBaseUser 
from django.contrib.auth.models import PermissionsMixin 
from django.contrib.auth.models import UserManager 

class User(AbstractBaseUser, PermissionsMixin): 

    username = models.CharField(_('username'), max_length=75, unique=True, 
     help_text=_('Required. 30 characters or fewer. Letters, numbers and ' 
        'underscores characters'), 
     validators=[ 
      validators.RegexValidator(re.compile('^[\w]+$'), 
      _('Enter a valid username.'), 'invalid') 
     ]) 
    first_name = models.CharField(_('first name'), max_length=254, blank=True) 
    last_name = models.CharField(_('last name'), max_length=30, blank=True) 
    email = models.EmailField(_('email address'), max_length = 254, unique = True, null = True) 
    is_staff = models.BooleanField(_('staff status'), default=False, 
     help_text=_('Designates whether the user can log into this admin ' 
        'site.')) 
    is_active = models.BooleanField(_('active'), default=True, 
     help_text=_('Designates whether this user should be treated as ' 
        'active. Unselect this instead of deleting accounts.')) 
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now) 

    objects = UserManager() 

    USERNAME_FIELD = 'username' 
    REQUIRED_FIELDS = ['first_name'] 

    def get_full_name(self): 
     return self.name 

    def get_short_name(self): 
     return self.username 

Vergessen Sie nicht, Ihre benutzerdefinierte Felder hinzuzufügen!

einen benutzerdefinierten Server-Betreiber wie so verwenden:

@admin.register(models.User) 
class CustomUserAdmin(UserAdmin): 
    list_display = ('name', 'username', 'is_staff',) 
    list_filter = ('is_staff',) 
    search_fields = ('first_name', 'last_name', 'username',) 
    readonly_fields = ('date_joined', 'last_login',) 
    fieldsets = (
     (None, { 
      'fields': ('username', 'password') 
     }), 
     ("Personal Information", { 
      'fields': ('first_name', 'last_name', 'email') 
     }), 
     ("Permissions", { 
      'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions') 
     }), 
     ("Important Dates", { 
      'fields': ('last_login', 'date_joined') 
     }), 
    ) 

Dann fügen sie schließlich, um Ihre Einstellungen:

AUTH_USER_MODEL = '<app_name>.User' 

Eine Arbeits Demonstration in meinem GitHub repository gefunden werden kann.

+1

nur dazu hinzuzufügen, sollte dies die allererste Änderung sein, die Sie an Ihrer App vornehmen, z. Migration '0001_initial.py', sonst funktioniert es aufgrund des Fehlers in der Frage nicht. Vielen Dank für Ihre Hilfe !! – VnC

+0

Kein Problem, ich bin glücklich zu helfen! – montudor

Verwandte Themen