2017-02-05 2 views
0

Ich arbeite an einer neuen Django-App und gehe zu einem benutzerdefinierten Benutzermodell, das von einer App namens accounts bereitgestellt wird, bevor ich irgendwelche Benutzer erstelle oder irgendwelche tatsächlichen Arbeiten erledige . Dies schien gut zu gehen- Ich habe seit ein paar Benutzer erstellt & den Admin angepasst, so dass ich bearbeiten kann & Benutzer von dort.Django benutzerdefiniertes Benutzermodell: anfängliche Migration hängt von der Migration für die Standard-Auth-App ab

ich geklont meine Repo auf einem anderen Computer & in einen Fehler liefen beim Versuch, den Dev-Server zu starten:

secondary machine after trying to start dev server

Dies macht Sinn, da ich keine auth Migrationen in meinem Projektverzeichnis finden . Allerdings, wenn ich einen neuen DB auf meiner Haupt-Dev-Maschine & läuft ./manage.py migrate, die Ausgabe enthält 8 Migrationen für die auth App erstellen:

main dev machine after migrating new db

Auf meiner sekundären Maschine, kann ich die Abhängigkeit in den accounts auf Kommentar anfängliche Migration, und die Dinge scheinen gut zu funktionieren - der Dev-Server startet, ich kann die Benutzer von meinem Haupt-Dev-Rechner (Ich benutze eine SQLite3 DB für jetzt) ​​sehen, & Verwenden Sie den Django Admin, aber ich brauche.

Ich dachte, dass Abhängigkeit irgendwie ein Überbleibsel sein könnte, also dachte ich, dass ich in der Lage sein könnte, die Referenz zu entfernen. Wenn ich jedoch diese Abhängigkeit von meinem Dev-Computer & Versuch, eine neue DB zu migrieren, kommentieren, erhalte ich einen Fehler.

Ich bin hier ratlos - wo sind diese auth Migrationen, wenn ich keine tatsächlichen Migrationsdateien habe? Sind sie in django.contrib.auth eingebaut?

BEARBEITEN: Es scheint, die auth Migrationen sind eingebaut, warum kann nicht mein Projekt zugreifen, wenn Sie versuchen, den Dev-Server auf meiner 2. Maschine zu starten? Ich habe versucht, Migrationen speziell für die App auth durchzuführen, um sicherzustellen, dass sie existieren, aber es werden keine Änderungen gemeldet.

als Referenz, das ist mein accounts Modell & Manager:

# accounts/models.py 
""" 
This model defines the custom user object 
The main object of this user model is to use email as the 
main unique field and remove username as a required field 
""" 

from django.contrib import auth 
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin 
from django.contrib.auth.signals import user_logged_in 
from django.contrib.contenttypes.models import ContentType 
from django.core import validators 
from django.core.exceptions import PermissionDenied 
from django.core.mail import send_mail 
from django.db import models 
from django.db.models.manager import EmptyManager 
from django.utils import six, timezone 
from django.utils.encoding import python_2_unicode_compatible 
from django.utils.translation import ugettext_lazy as _ 

class UserManager(BaseUserManager): 
    use_in_migrations = True 

    def _create_user(self, email, password, username=None, **extra_fields): 
     """ 
     Creates and saves a User with the given username, email and password. 
     """ 
     if not email: 
      raise ValueError('The given email must be set') 
     email = self.normalize_email(email) 
     user = self.model(email=email, **extra_fields) 
     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_user(self, email, username=None, password=None, **extra_fields): 
     extra_fields.setdefault('is_staff', False) 
     extra_fields.setdefault('is_superuser', False) 
     return self._create_user(email, password, **extra_fields) 

    def create_superuser(self, email, password, **extra_fields): 
     extra_fields.setdefault('is_staff', True) 
     extra_fields.setdefault('is_superuser', True) 

     if extra_fields.get('is_staff') is not True: 
      raise ValueError('Superuser must have is_staff=True.') 
     if extra_fields.get('is_superuser') is not True: 
      raise ValueError('Superuser must have is_superuser=True.') 

     return self._create_user(email, password, **extra_fields) 

class User(AbstractBaseUser, PermissionsMixin): 
    """ 
    A base class implementing a fully featured User model with 
    admin-compliant permissions. 
    Email and password are required. Other fields are optional. 
    """ 
    first_name = models.CharField(_('first name'), max_length=30, blank=True) 
    last_name = models.CharField(_('last name'), max_length=30, blank=True) 
    username = models.CharField(
     _('username'), 
     max_length=150, 
     blank=True, 
     null=True, 
     help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'), 
     validators=[ 
      validators.RegexValidator(
       r'^[\[email protected]+-]+$', 
       _('Enter a valid username. This value may contain only ' 
        'letters, numbers ' 'and @/./+/-/_ characters.') 
      ), 
     ], 
     error_messages={ 
      'unique': _("A user with that username already exists."), 
     }, 
    ) 
    email = models.EmailField(
     _('Email Address'), unique=True, 
     error_messages={ 
      'unique': _("A user with that email already exists."), 
     } 
    ) 
    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) 

    #app-specific user fields 
    has_picked = models.BooleanField(default=False) 

    objects = UserManager() 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['first_name', 'last_name'] 

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

    def get_full_name(self): 
     """ 
     Returns the first_name plus the last_name, with a space in between. 
     """ 
     full_name = '%s %s' % (self.first_name, self.last_name) 
     return full_name.strip() 

    def get_short_name(self): 
     "Returns the short name for the user." 
     return self.first_name 

    def email_user(self, subject, message, from_email=None, **kwargs): 
     """ 
     Sends an email to this User. 
     """ 
     send_mail(subject, message, from_email, [self.email], **kwargs) 

    @property 
    def display_name(self): 
     """ 
     Returns first name and last initial, first name, or email prefix 
     Depending on whats available 
     """ 
     if self.first_name: 
      if self.last_name: 
       return self.first_name + ' ' + self.last_name[0] + '.' 
      else: 
       return self.first_name 
     else: 
      return self.email.split('@')[0] 

Und mein INSTALLED_APPS:

INSTALLED_APPS = [ 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'accounts', 
] 
+0

Ja, sie sind eingebaut. Haben Sie die Auth App in INSTALLED_APPS? –

+0

Ja, das tue ich. Ich hätte meine INSTALLED_APPS in die Frage einfügen sollen. Hinzufügen dieser jetzt – dkhaupt

+0

also, was ist deine Frage noch einmal? – yedpodtrzitko

Antwort

1

Migration 0008 in dem Auth-App wurde in Django 1.10 hinzugefügt. Sie haben vermutlich eine ältere Version von Django auf der anderen Maschine ausgeführt.

+0

Schießen, danke. Das ist genau richtig - ich wusste, dass meine Versionen anders waren, aber es kam mir nie in den Sinn, dass es der Schuldige sein könnte. Vielen Dank! – dkhaupt

Verwandte Themen