2017-01-12 6 views
1

djangoでユーザーモデルを変更した後にエラーが発生しました。createduperuserはユーザー名を要求していません

スーパーユーザーを作成しようとしたときに、ユーザー名の入力が求められず、スキップされていましたが、とにかくオブジェクトのユーザー名が必要で、ユーザー作成が失敗しました。

import jwt 
from django.db import models 
from django.contrib.auth.models import (AbstractBaseUser, BaseUserManager, 
PermissionsMixin) 
from datetime import datetime, timedelta 
from django.conf import settings 
# from api.core.models import TimeStampedModel 


class AccountManager(BaseUserManager): 

    def create_user(self, username, email, password=None, **kwargs): 
     if not email: 
      raise ValueError('Please provide a valid email address') 

     if not kwargs.get('username'): 
      # username = 'what' 
      raise ValueError('User must have a username') 

     account = self.model(
        email=self.normalize_email(email), username=kwargs.get('username')) 

     account.set_password(password) 
     account.save() 

     return account 

    def create_superuser(self,username, email, password, **kwargs): 
     account = self.create_user(username, email, password, **kwargs) 

     account.is_admin = True 
     account.save() 

     return account 

class Account(AbstractBaseUser): 
    email = models.EmailField(unique=True) 
    username = models.CharField(max_length=40, unique=True) 

    first_name = models.CharField(max_length=40) 
    last_name = models.CharField(max_length =40, blank=True) 

    tagline = models.CharField(max_length=200, blank=True) 

    is_admin = models.BooleanField(default=False) 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELD = ['username'] 


    objects = AccountManager() 

    def __str__(self): 
     return self.username 

    @property 
    def token(self): 
     return generate_jwt_token() 

    def generate_jwt_token(self): 
     dt = datetime.now + datetime.timedelta(days=60) 

     token = jwt.encode({ 
      'id': self.pk, 
      'exp': int(dt.strftime('%s')) 
      }, settings.SECRET_KEY, algorithm='HS256') 
     return token.decode('utf-8') 

    def get_full_name(self): 
     return ' '.join(self.first_name, self.last_name) 

    def get_short_name(self): 
     return self.username 

それがこの結果:

manage.py createsuperuser 
Running 'python /home/gema/A/PyProject/janet_x/janet/manage.py createsuperuser' command: 
Email: [email protected] 
Password: 
Password (again): 
Traceback (most recent call last): 
    File "/home/gema/A/PyProject/janet_x/janet/manage.py", line 22, in <module> 
    execute_from_command_line(sys.argv) 
    File "/home/gema/.virtualenvs/JANET/lib/python3.5/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line 
    utility.execute() 
    File "/home/gema/.virtualenvs/JANET/lib/python3.5/site-packages/django/core/management/__init__.py", line 359, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/home/gema/.virtualenvs/JANET/lib/python3.5/site-packages/django/core/management/base.py", line 294, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/home/gema/.virtualenvs/JANET/lib/python3.5/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 63, in execute 
    return super(Command, self).execute(*args, **options) 
    File "/home/gema/.virtualenvs/JANET/lib/python3.5/site-packages/django/core/management/base.py", line 345, in execute 
    output = self.handle(*args, **options) 
    File "/home/gema/.virtualenvs/JANET/lib/python3.5/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 183, in handle 
    self.UserModel._default_manager.db_manager(database).create_superuser(**user_data) 
TypeError: create_superuser() missing 1 required positional argument: 'username' 

私はシェルを使用する場合:

Account.objects.create(u'administer', u'[email protected]', u'password123') 

を、それが返されます。

return getattr(self.get_queryset(), name)(*args, **kwargs) 
TypeError: create() takes 1 positional argument but 3 were given 

を、おそらく間違っている可能性が何? ありがとうございます。

+0

ここでは、ユーザ名のみを入力してみてください.defdef create_superuser(自己、ユーザ名、** kwargs): –

答えて

3

REQUIRED_FIELDREQUIRED_FIELDS(複数)にする必要があります。そうしないと、DjangoはREQUIRED_FIELDSに何も見つかりませんでしたので、ユーザ名(またはその他の必須フィールド)は要求されません。

は一例として、私は私のプロジェクトの一つで、こののUserManagerを使用します。

class UserManager(BaseUserManager): 
    def create_user(self, email, password=None, first_name=None, last_name=None, **extra_fields): 
     if not email: 
      raise ValueError('Enter an email address') 
     if not first_name: 
      raise ValueError('Enter a first name') 
     if not last_name: 
      raise ValueError('Enter a last name') 
     email = self.normalize_email(email) 
     user = self.model(email=email, first_name=first_name, last_name=last_name, **extra_fields) 
     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, email, password, first_name, last_name): 
     user = self.create_user(email, password=password, first_name=first_name, last_name=last_name) 
     user.is_superuser = True 
     user.is_staff = True 
     user.save(using=self._db) 
     return user 

USERNAME_FIELD('first_name', 'last_name')emailREQUIRED_FIELDSに設定されています。あなたのニーズに合わせてこの例を適応させることができるはずです。

+0

ありがとうございます、私はあなたが正しいと思いますが、どうすればこの設定をリセットできますか?なぜなら、私はそれを複数に変更してもまだユーザー名を聞かなかったからです。 –

+0

@BarackObama私はあなたのニーズに適応できるいくつかのサンプルコードで私の答えを更新しました。 –

+0

それは私のために目を覚ました。 –

1

このビットは意味がありません。

USERNAME_FIELD = 'email' 
REQUIRED_FIELD = ['username'] 

は、なぜあなたは、「電子メール」にUSERNAME_FIELDを設定していますか?確かにそれは "username"でなければなりません。

+0

私はそれを変更しようとしていますが、まだユーザ名を尋ねません。このためのmanage.pyコマンドの直接設定があるかどうか知っていますか? –

関連する問題