Дополнительные данные, специфичные для пользовательских типов - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть модель типа пользователя с выбором типа поля пользователя, т. Е. 1 и типа пользователя, т. Е. 2 usertype находится в соотношении один к одному с usermodel. Теперь мне нужно создать специальное поле только для пользователя типа 2.

Как расширить пользовательские профили в соответствии с типами пользователей (ролями)

USER_TYPE_CHOICES = (
      (1, 'student'),
      (2, 'teacher'),

  )

  user_type = models.IntegerField(choices=USER_TYPE_CHOICES)

class UserProfile(models.Model):  
    user = models.ForeignKey(User, unique=True)
    location = models.CharField(max_length=140)  
    gender = models.CharField(max_length=140)  
    profile_picture = models.ImageField(upload_to='thumbpath', blank=True)

    def __unicode__(self):
        return u'Profile of user: %s' % self.user.username

1 Ответ

0 голосов
/ 25 апреля 2019

Вам нужно сделать два декоратора для разделения видов с разными разрешениями, например: Учитель & Ученик Я использовал встроенный user_passes_test , чтобы создать два пользовательских декоратора.Один для проверки, является ли пользователь студентом, а другой - для проверки, является ли пользователь учителем.

App/decorators.py

from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.auth.decorators import user_passes_test


def student_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url='login'):
    '''
    Decorator for views that checks that the logged in user is a student,
    redirects to the log-in page if necessary.
    '''
    actual_decorator = user_passes_test(
        lambda u: u.is_active and u.is_student,
        login_url=login_url,
        redirect_field_name=redirect_field_name
    )
    if function:
        return actual_decorator(function)
    return actual_decorator


def teacher_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url='login'):
    '''
    Decorator for views that checks that the logged in user is a teacher,
    redirects to the log-in page if necessary.
    '''
    actual_decorator = user_passes_test(
        lambda u: u.is_active and u.is_teacher,
        login_url=login_url,
        redirect_field_name=redirect_field_name
    )
    if function:
        return actual_decorator(function)
    return actual_decorator

Теперь в вашем views.py Вы можете использовать декоратор, как этот "

from django.contrib.auth.decorators import login_required
from .decorators import student_required

@login_required
@student_required  # <-- here!
def some_func(request, pk):


    # body of the view...

    return render(request, 'app/template.html', {})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...