2017-02-22 34 views
1

Я немного новичок в Django. Я создал модель на заказ пользователя, потому что я хотел использовать электронную почту для аутентификации и следовали примеру в документации, которая работает хорошо, и имеют следующий код:Каков наилучший способ добавить дополнительные поля в модель пользователя Django

class CustomUserManager(BaseUserManager): 

    def _create_user(self, email, password, 
       is_staff, is_superuser, **extra_fields): 
     """ 
     Creates and saves a User with the given email and password. 
     """ 
     now = timezone.now() 
     if not email: 
      raise ValueError('The given email must be set') 
     email = self.normalize_email(email) 
     user = self.model(email=email, 
         is_staff=is_staff, is_active=True, 
         is_superuser=is_superuser, last_login=now, 
         date_joined=now, **extra_fields) 
     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_user(self, email, password=None, **extra_fields): 
     return self._create_user(email, password, False, False, 
          **extra_fields) 

    def create_superuser(self, email, password, **extra_fields): 
     return self._create_user(email, password, True, True, 
          **extra_fields) 


class User (AbstractBaseUser, PermissionsMixin): 
    ''' 
    Custom User Model 
    ''' 
    email = models.EmailField(verbose_name = "email address", max_length = 255, unique = True) 
    date_joined = models.DateTimeField('date joined', default=timezone.now) 
    first_name = models.CharField(_('first name'), max_length=30, blank=False) 
    last_name = models.CharField(_('last name'), max_length=30, blank=False) 
    is_active = models.BooleanField(default=True) 
    is_admin  = models.BooleanField(default=False) 
    is_staff  = models.BooleanField(default=False) 

    USERNAME_FIELD = "email" 
    REQUIRED_FIELDS = [] 

    objects = CustomUserManager() 

    def get_absolute_url(self): 
     return "https://stackoverflow.com/users/%s/" % urlquote(self.email) 

    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): 
     """ 
     Sends an email to this User. 
     """ 
     send_mail(subject, message, from_email, [self.email]) 

Моя единственная проблема сейчас я хочу, чтобы добавить дополнительную информацию к моей пользовательской модели пользователя, такой как дата доступности, изображение профиля, плата и т. д. (я делаю сайт mini linkedin). Я чувствую, что добавление тонны дополнительных полей в модель User немного беспорядочно, и со временем количество полей будет расти. Есть лучший способ сделать это?

Благодаря

+0

Исправьте отступы кода. Мы не можем читать его должным образом, как сейчас. – Chris

+0

@ Крис исправил отступ кода. Извините –

ответ

1

Там нет причин, чтобы не добавить больше полей для этой модели, как вы описываете. Это именно то, для чего предназначена эта пользовательская модель и миграция модели.

Если вы хотите, чтобы создавать различные профили пользователей для различных пользователей, вы можете использовать multi table inheritance, например, так:

class User (AbstractBaseUser, PermissionsMixin): 
    ''' 
    Custom User Model 
    ''' 
    ...fields that are common to CreativeUser and ClientUser 

class CreativeUser(User): 
    # Fields unique to CreativeUser 

class ClientUser(User): 
    # Fields unique to ClientUser 

Теперь вы можете запросить все пользователь с помощью User.objects.all(), вы можете запросить CreativeUser.objects.all() или ClientUser.objects.all() , Обратите внимание: User.objects.all() не будет содержать никаких полей, которые являются уникальными для любой из двух других таблиц.

+0

спасибо за ваш ответ. Я думаю, что меня беспокоит то, что будут два типа пользователей: CreativeUser и ClientUser, которые будут совместно использовать общие черты пользователя. Оба типа пользователей будут иметь разные вещи и будут проходить отдельные формы регистрации, чтобы захватывать уникальную информацию для обоих типов. Я не был уверен, что лучше всего создать модель UserProfile для каждого типа пользователей с отображением OneToOneField или просто подкласса User. –

+0

@FrancisN обновил мой ответ – YPCrumble

+0

это сработало !!! Я использовал CreativeUser в качестве моей модели формы для RegistrationForm, а дополнительные поля, которые я хотел, появились и сохранены вместе с пользователем. Огромное спасибо? Кудус !! –

0

Что касается вашего запроса я хотел бы предложить вам использовать расширение: django-custom-user