我有一个用户类型模型,其中选择字段用户类型即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
答案 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', {})