2015-03-23 2 views
2

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

Должен ли я использовать пользовательскую модель пользователя или встроенную модель пользователя? У меня есть дополнительные свойства, такие как лицензия, местоположение, языки, фото и т. Д. Для агентов и брокеров.

class MyUser(AbstractBaseUser): 
    AGENTS = 'AG' 
    BROKERS = 'BR' 
    COMPANY = 'CP' 
    CUSTOMER = 'CM' 

    ROLE_IN_CHOICES = (
     (AGENTS, 'Agent'), 
     (BROKERS, 'Broker'), 
     (COMPANY, 'Company'), 
     (CUSTOMER, 'Customer')) 

    first_name = models.CharField(max_length=100, blank=True) 
    second_name = models.CharField(max_length=100, blank=True) 
    middle_name = models.CharField(max_length=100, blank=True) 
    dob = models.DateField(blank=True, null=True) 
    phone = models.CharField(max_length=10) 
    secondary_phone = models.CharField(max_length=10, blank=True, null=True) 

......

@property 
def is_agent(self): 
    return self.role in (self.AGENTS) 

@property 
def is_customer(self): 
    return self.role in (self.CUSTOMER) 

@property 
def is_broker(self):* 
    return self.role in (self.BROKER) 

@property 
def is_company(self): 
    return self.role in (self.COMPANY) 

....

Могу ли я не использовать базовую модель пользователя и достижения же? Я нахожусь на записи?

Как создать публичные страницы для этих ролей (Агенты, Брокеры)?

Это моя первая попытка с Python и Django. Я использую Django 1.7.7 с Python 3.4

ответ

1

Вы должны простираться от Django модели User вместо и добавить дополнительные поля, которые нужны:

from django.contrib.auth.models import User as Auth_User 

class User(Auth_User): 

    # add your extra fields here like roles, etc 
    phone = CharField(max_length=20, null=True, blank=True) 

    # add your extra functions 
    def extra_user_function(self): 
     return "This is an extra function" 

Таким образом у вас есть свои собственные поля, а также Джанго пользователя поля ...

После миграции, если вы проверите базу данных, вы получите таблицы auth_user и your_app_user.

Просто голые в виду, что request.user только даст вам супер полей ... Для того, чтобы получить расширенный класс вам нужно

User.objects.get(id=request.user.id) 

последняя будет иметь только дополнительные поля и его идентификатор будет таким же, как auth.User, если вы не добавите auth_user самостоятельно.

Внимание: это важно!

В противном случае request.user.id и your_app.User.id не совпадают, поэтому User.objects.get (ID = request.user.id) не будет работать, и вы будете иметь для запроса БД, чтобы найти your_app.User.id

User.object.get(user_ptr_id = request.user.id) 

Другие вещи, чтобы рассмотреть

Это будет работать:

# you_app.User objects gets vars from auth.User 
user = User.objects.get(id=request.user.id) 
first_name = user.first_name 

Но это не будет работать

# auth.User trying to get a function from your_app.User 
user = request.user 
user.extra_user_function() 

Так что модель пользователя может быть что-то вроде этого:

import os 
from django.contrib.auth.models import User as Django_User 
from django.db.models import CharField, ImageField 

class User(Django_User): 

    phone = CharField(max_length=20, null=True, blank=True) 
    observations = CharField(max_length=2048, null=True, blank=True) 
    picture = ImageField(upload_to='users', default='default/avatar.jpg') 

    class Meta: 
     # adding extra permissions (default are: add_user, change_user, delete_user) 
     permissions = (
      ("access_user_list", "Can access user list"), 
      ("access_user", "Can access user"), 
     ) 
     ordering = ["-is_staff", "first_name"] 

Вместо того чтобы создавать роли на пользователя, Django уже есть группы, так что вы должны использовать их ,

Группы следовать той же логике:

from django.contrib.auth.models import Group as Auth_Group 
from django.db import models 

class Group(Auth_Group): 

    observations = models.CharField(max_length=2048, null=True, blank=True) 

    def get_users_in_group(self): 
     return self.user_set.filter(is_active=1).order_by('first_name', 'last_name') 

    def count_users_in_group(self): 
     return self.user_set.count() 

    def __unicode__(self): 
     return self.name 

    class Meta: 
     permissions = (
      ("access_group_list", "Can access group list"), 
      ("access_group", "Can access group"), 
     ) 
     ordering = ["name"] 

Вы можете очистить/добавить пользователей в группу:

user.groups.clear() 
user.groups.add(group) 

Clear/добавить разрешения для группы:

group.permissions.clear() 
group.permissions.add(permission) 

Существует также декоратор, чтобы проверить, имеет ли пользователь разрешения

from django.contrib.auth.decorators import permission_required 

@permission_required(("users.change_user","users.access_user",)) 
def your_view(request): 
    ... 

Я пробовал много вещей в прошлом, но я думаю, что это путь.

Если вам действительно нужны роли, и пользователь может иметь более чем одну роль, Mayb лучше всего было бы создать модель роли и добавить, что пользователь имеет ManyToMany поле

roles = ManyToManyField(Role) 

но вам мог бы сделать это с группами

+0

Спасибо за быстрый ответ. В чем разница между расширением auth_user и AbstractBaseUser? Как связать разные типы пользователей с этой новой моделью? Создание разных моделей пользователей - лучший выбор по сравнению с одной моделью для всех? – timberHill

+0

проверьте файл auth.models.py. Пользовательская модель расширяет AbstractModel, но имеет мета-поле «swappable». Для того, что я читал, это позволяет заменить модель на одну из своих, но я не уверен. Что касается привязки разных типов пользователей, используйте поле «groups» и следуйте той же логике. Вы можете расширить свою «Компанию» из auth.Group, дать ей больше полей и установить разрешения ... Позвольте мне добавить группы к ответу ... – brunofitas

+0

Почему бы не использовать [django.contrib.auth.models.AbstractUser] (https://docs.djangoproject.com/en/1.7/topics/auth/customizing/#extending-django-s-default-user)? – sneawo

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