2015-05-18 3 views
-2

Я хочу код блога с Django. Модель пользователя по умолчанию не подходит для моего блога, я хочу закодировать моего собственного пользователя.django не может создать суперпользователя

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

class MyUserManager(BaseUserManager): 
    def create_superuser(self, email, username, password, created_at): 
     user = self.create_user(email=email, 
      username=username, 
      password = password, 
      created_at = created_at 
      ) 
     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, 
     ) 

    username = models.CharField(
     max_length = 100, 
     unique = True, 
     db_index = True, 
     ) 

    created_at = models.DateField() 

    is_active = models.BooleanField(default = True) 
    is_admin = models.BooleanField(default = False) 

    objects = MyUserManager() 

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

    def get_full_name(self): 
     return self.email 

    def get_short_name(self): 
     return self.username 

    def __unicode__(self): 
     return self.email 

    def has_perm(self, perm, obj=None): 
     return True 

    def has_module_perms(self, app_label): 
     return True 

    @property 
    def is_staff(self): 
     return self.is_admin 

У него есть ошибка. enter image description here

Я следую инструкциям по обучению. Я не знаю, почему эта проблема возникает.

Я размещаю модель MyUser, надежда может помочь ответить на этот вопрос.

Что я могу сделать?

+1

Как вы звоните в 'create_superuser' метод? –

+0

С 3 аргументами. Я предполагаю, что вы опускаете 'created_at', когда вы вызываете этот метод. – RickyA

+0

Публикация модели MyUser будет полезна для ответа. – moonstruck

ответ

1

Вы должны создать экземпляр MyUserManager и вызвать его метод create_superuser со всеми позиционными аргументами. Вы получаете TypeError, потому что инфраструктура вызывает create_superuser без соответствующих позиционных аргументов. Если вы получаете эту ошибку при запуске задачи manage.py, например manage.py createsuperuser, то это потому, что manage.py пытается вызвать create_superuser, не получая правильное количество аргументов вместе. Эти аргументы обрабатываются путем установки соответствующих полей в MyUser объекта:

Учет дополнительных аргументов в методе create_superuser

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

Есть другие серьезные проблемы с вашим кодом. От "Customizing Authentication" documentation вы увидите, что вы должны продлить create_user и create_superuser в обоих случаях, имя_пользователя - это первый позиционный аргумент, а в файле create_superuser пароль - второе позиционное поле. Я изменил ваш код, чтобы включить метод create_user в класс MyUserManager.

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

class MyUserManager(BaseUserManager): 
    def create_user(self, username, password, email, created_at): 
     """ 
     Creates and saves a User with the given username, password, email, created_a 
     birth and password. 
     """ 
     if not username: 
      raise ValueError('Users must have a username') 
     if not email: 
      raise ValueError('Users must have an email address') 

     user = self.model(
      username=username, 
      email=self.normalize_email(email), 
      created_at=created_at, 
     ) 
     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, username, password, email, created_at): 
     user = self.create_user(username, password, email, created_at) 
     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, 
     ) 

    username = models.CharField(
     max_length = 100, 
     unique = True, 
     db_index = True, 
     ) 

    created_at = models.DateField() 

    is_active = models.BooleanField(default = True) 
    is_admin = models.BooleanField(default = False) 

    objects = MyUserManager() 

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

    def get_full_name(self): 
     return self.email 

    def get_short_name(self): 
     return self.username 

    def __unicode__(self): 
     return self.email 

    def has_perm(self, perm, obj=None): 
     return True 

    def has_module_perms(self, app_label): 
     return True 

    @property 
    def is_staff(self): 
     return self.is_admin 

Наконец, вы должны завершить работу на примере, чтобы получить все это проводной соответствующим образом, follow along with the full example

+0

Спасибо. Это работа. – Koo