我有一个基本问题,对新的Django开发人员有用。
我在Django中创建了自己的UserProfile。此UserProfile具有一个名为“type”的特定字段。这个字段可以有两个值(直到现在可能更多):男性 - 男/女 - F:
from django.contrib.auth.models import User
GENDER = (
(M, 'Male'),
(F, 'Female'),
)
class UserProfile(models.Model):
user = models.OneToOneField(User)
type = models.CharField( max_length=2,
choices=GENDER,
default='F')
基本上,我想允许访问限制访问权限或根据用户类型调整页面内容。到目前为止,我使用了一种非常基本和初学的方法,即在视图中测试用户类型,然后处理页面:
def OnePage(request):
if request.user.type == 'M':
....
else if request.user.type =='F':
....
然后我还需要根据用户类型调整呈现的模板:男性用户不会拥有与女性用户相同的个人资料页面。
我确信有更好的方法可以做到这一点,但作为一个Django初学者,我很遗憾所有的Django可能性。所以,如果您有任何最佳实践来实现这一点,请告诉我(显然我想在每个视图中使用干密码!)
感谢您的帮助。
答案 0 :(得分:5)
要限制访问权限,请使用user passes test装饰器:
from django.contrib.auth.decorators import user_passes_test
male_only = lamda u: u.type == 'M'
female_only = lamda u: u.type == 'F'
@user_passes_test(male_only)
def myfunc(request):
pass
@user_passes_test(female_only)
def myotherfunc(request):
pass
答案 1 :(得分:2)
一种解决方案可能是根据用户类型更改基本模板名称:
@render_to('some_template.html')
def some_view(request):
base_template = 'base_%s.html' % request.user.profile.type
# …
return {
'base_template': base_template,
}
在你的模板中:
{% extends base_template %}
{% block some-block %}
…
{% endblock %}
如果您需要在每个视图上执行此操作,可以使用中间件来设置此值。
答案 2 :(得分:0)
要向用户添加额外数据,请参阅
Storing additional information about users
然后将个人资料添加到您的上下文中,您可以在模板中使用{{profile}}变量
{% if profile.type == "F" %}
blah, blah
{% else %}
blah, blah
{% endif %}
答案 3 :(得分:0)
根据您的目的,如果您需要为不同性别使用非常不同的html,您可以尝试这种方法:
def gender_filter(func):
def _view(request,*args,**kwargs):
res=func(request,*args,**kwargs)
if request.user.get_profile().type=='F':
res.template_name='template_f.html'
res.context_data['gender']='female'
elif request.user.get_profile().type=='M':
res.template_name='template_m.html'
res.context_data['gender']='male'
return res.render()
return _view
@gender_filter
def my_view(request):
t=TemplateResponse(request,'template_f.html',{...})
return t
因此,不是在视图中返回Http共振,而是可以让它们返回TemplateResponse个对象并使用装饰器来更改模板,添加一般上下文,然后将它们转换为HttpResponse。
或类似权限检查:
def gender_only(gender):
def _dec(func):
def _view(request,*args,**kwargs):
if request.user.get_profile().type==gender
return func.render(request,*args,**kwargs)
else:
raise Exception("You do not have the right gender")
return _view
return _dec
@gender_only('F')
def my_view(request):
...
return render_to_response('template.html',{...},context_instance=RequestContext(request))