2014-01-12 3 views
0

Я пытаюсь реализовать Users класс от django.contrib.auth.models, как это:Как расширить модель пользователя django?

from django.db import models 
from django.contrib.auth.models import User 


class Registration(models.Model): 
    '''Represents a user registration.''' 
    user    = models.ForeignKey(User) 
    registration_date = models.DateTimeField(auto_now_add=True, help_text='The date of the registration') 

    def __str__(self): 
     return '%s - %s' % (self.user, self.registration_date,) 

Этот пользователь имеет два атрибута по умолчанию включено: имя пользователя, пароль

screenshoot

Чтение на the code I может видеть, что есть больше атрибутов, таких как имя и адрес электронной почты.

Как можно включить те скрытые (если это правильно) атрибуты?

ответ

5

Во-первых, эти атрибуты не скрыты. Предполагая, что у вас есть «django.contrib.auth» и «django.contrib.contenttypes» в вашем INSTALLED_APPS, тогда у вас есть доступ к модели User, как она определена в вашей ссылке. См. here для документации по использованию/доступу к нему.

Однако, так как вы указали расширенияUser модель, я ожидаю, что вы хотите добавить некоторые из ваших собственных полей к нему (несмотря на то, что ваш пример registration_date существует и доступен через myuser.date_joined).


Более старый, более стабильный и более распространенный способ сделать это аналогичен тому, что у вас есть. Единственное отличие состоит в том, чтобы использовать OneToOneField(User) вместо ForeignKey(User). Это делает отношения двунаправленными и более удобными, заставляя их. Вам нужно убедиться и создать объект Registration для каждого созданного User.

Фактически, есть то, что вы хотите в документах для OneToOneField.

from django.db import models 
from django.contrib.auth.models import User 

class Registration(models.Model): 
    user = models.OneToOneField(User) 
    registration_date = models.DateTimeField(auto_now_add=True) 

>>> user = User.objects.get(pk=1) 
>>> registration = Registration.objects.create(user=user) 
>>> user.registration.registration_date 
# Should give the current time 
>>> user.get_full_name() 
# Should also have all those *hidden* attributes linked above 

На Django 1.5, вы можете использовать свою собственную модель пользовательского пользователя довольно легко. Документация по этой функции: here. Если вы просто добавляете дополнительные поля, вы можете подклассифицировать модель пользователя и добавить свои собственные поля.

from django.db import models 
from django.contrib.auth.models import AbstractUser 

class MyUser(AbstractUser): 
    # We inherit all those nifty things from AbstractUser 
    registration_date = models.DateTimeField(auto_now_add=True) 

Затем включите его в свои settings.py, добавив AUTH_USER_MODEL = 'myapp.MyUser'. Теперь у нас есть доступ к пользовательской модели немного по-другому

>>> from django.contrib.auth import get_user_model() 
>>> Users = get_user_model() 
>>> user = Users.objects.get(pk=1) 
>>> user.registration_date 
# Should give the current time 
>>> user.get_full_name() 
# Should have those 'hidden' attributes 

Все это доступно в соответствии extending и substituting модель пользователя в документации.

+0

Но кто может ввести эти атрибуты из формы * Добавить нового пользователя? Например, вы можете видеть на моем скриншоте, что я могу ввести имя пользователя и пароль, но я хочу использовать имя, адрес электронной почты и другие. Эти атрибуты находятся на моделях по умолчанию, поэтому я не хочу их перезаписывать. – Lucio

+0

@Lucio Я вижу, ваш вопрос о расширении формы администратора django. Взгляните на полный пример внизу [здесь] (https://docs.djangoproject.com/en/1.6/themes/auth/customizing/# extension-user), особенно там, где сказано: «в файле admin.py приложения должен быть указан следующий код». Я обновляю свой пост, когда у меня будет время проверить его. – kalhartt

Смежные вопросы