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:
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:
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',
]
Ja, sie sind eingebaut. Haben Sie die Auth App in INSTALLED_APPS? –
Ja, das tue ich. Ich hätte meine INSTALLED_APPS in die Frage einfügen sollen. Hinzufügen dieser jetzt – dkhaupt
also, was ist deine Frage noch einmal? – yedpodtrzitko