我有几个需要“重定向”过滤器的功能。重定向过滤器就像这样 -
1)如果用户未登录且没有会话数据,则重定向到登录页面。
2)如果用户已登录并已填写页面,则重定向到用户主页。
3)如果用户已登录但尚未填写页面,请留在页面上。
4)如果用户未登录并拥有会话数据,请留在页面上
我已经开始将这些函数转换为基于类的方法,以使其更高效,更少代码(以前我的视图函数非常庞大)。这是我尝试制作基于类的东西的第一次尝试,这是我到目前为止所做的 -
def redirect_filter(request):
if request.user.is_authenticated():
user = User.objects.get(email=request.user.username)
if user.get_profile().getting_started_boolean:
return redirect('/home/') ## redirect to home if a logged-in user with profile filled out
else:
pass ## otherwise, stay on the current page
else
username = request.session.get('username')
if not username: ## if not logged in, no session info, redirect to user login
return redirect('/account/login')
else:
pass ## otherwise, stay on the current page
def getting_started_info(request, positions=[]):
location = request.session.get('location')
redirect_filter(request)
if request.method == 'POST':
form = GettingStartedForm(request.POST)
...(run the function)...
else:
form = GettingStartedForm() # inital = {'location': location}
return render_to_response('registration/getting_started_info1.html', {'form':form, 'positions': positions,}, context_instance=RequestContext(request))
显然,这种观点还没有完全发挥作用。我如何将其转换为功能性的东西?
另外,我有三个变量需要在几个getting_started
函数中重用:
user = User.objects.get(email=request.user.username)
profile = UserProfile.objects.get(user=user)
location = profile.location
我将把这些变量定义放在哪里,以便我可以在所有函数中重用它们,我将如何调用它们? 谢谢。
答案 0 :(得分:2)
Django实际上已经包含了一个login_required装饰器,它使处理用户身份验证变得微不足道。只需在view.py页面顶部包含以下内容:
from django.contrib.auth.decorators import login_required
然后添加
@login_required
在任何需要登录的视图之前。它甚至会在用户登录后将用户重定向到相应的页面。
更多信息: https://docs.djangoproject.com/en/dev/topics/auth/#the-login-required-decorator
这应该会大大简化您的视图,并且可能导致不必编写单独的类,因为剩下的只是一个简单的重定向。
对于变量,每个请求都包含一个request.user对象,其中包含有关用户的信息。您可以在文档中搜索请求和响应对象以了解更多信息。
您可以通过扩展用户模块来使用该用户对象来获取配置文件变量。在您的设置中设置AUTH_PROFILE_MODULE ='myapp.UserProfile',这将允许您访问用户配置文件,如下所示:
user.get_profile().location.
更多相关信息: http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/