特定于用户类型的额外数据

时间:2019-04-25 06:10:01

标签: django

我有一个用户类型模型,其中选择字段用户类型即1和用户类型即2 用户类型与用户模型是一对一的关系。现在,我只需要为用户类型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 :(得分:0)

您需要制作两个装饰器以分隔具有不同权限的视图,即教师学生 我使用内置的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', {})