2016-03-27 5 views
0

Ich erhalte einen Fehler ValueError: Users must have a valid username beim Versuch, den create_superuser Befehl von der Kommandozeile mit Django 1.7.1 aufzurufen. Ich folge einem Tutorial, das ein benutzerdefiniertes Benutzermodell mit dem E-Mail-Feld als USERNAME_FIELD erstellt. Es fragt mich nicht nach einem Benutzernamen und ich habe versucht, den Benutzernamen als Option mit python manage.py createsuperuser --username=someusername und python manage.py createsuperuser username=someusername zu übergeben. Ausschnitte meines Codes sind unten.Python create_user Fehler

models.py

# Create your models here. 
from django.contrib.auth.models import AbstractBaseUser 
from django.db import models 
from django.contrib.auth.models import BaseUserManager 

class AccountManager(BaseUserManager): 
    def create_user(self, email, password=None, **kwargs): 
     if not email: 
      raise ValueError('Users must have a valid email address.') 

     if not kwargs.get('username'): 
      raise ValueError('Users must have a valid 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, email, password, **kwargs): 
     account = self.create_user(email, password, **kwargs) 

     account.is_admin = True 
     account.save() 

     return account 

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

    first_name = models.CharField(max_length=40, unique=True) 
    last_name = models.CharField(max_length=40, unique=True) 
    tagline = models.CharField(max_length=140, unique=True) 

    is_admin = models.BooleanField(default=False) 

    created_at = models.DateTimeField(auto_now_add=True) 
    modified_at = models.DateTimeField(auto_now=True) 

    objects = AccountManager() 

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

    def __unicode__(self): 
     return self.email 

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

    def get_short_name(self): 
     return self.first_name 

In der settings.py Datei habe ich die Authentifizierung auf die Liste der installierten Anwendungen hinzugefügt und ich habe definiert AUTH_USER_MODEL als authentication.Account

Antwort

1

Set REQUIRED_FIELDS statt REQUIRED_FIELD. Dies ist eine Liste von Feldnamen, die createsuperuser anfordert. Es muss alle Felder Ihres benutzerdefinierten Benutzermodells enthalten, die nicht NULL-fähig oder nicht-blanklegbar sind. In Ihrem Fall sollten Sie also auch first_name, last_name und tagline einschließen.

Dies ist well-documented.

+0

Vielen Dank. Es war dieser Tippfehler, der das getan hat. Ich denke, das ist, wenn Kopieren und Einfügen eine gute Sache sein kann. Nochmals vielen Dank und in der Zukunft werde ich versuchen, meinen Code viel mehr zu hinterfragen, um zu verhindern, dass dumme Fehler wie diese im Forum gepostet werden :). – Courtney