在Django中的几个视图中执行一个函数

时间:2012-10-27 18:43:04

标签: python django django-views

所以我仍然是Django的新手,我想就此提出建议:

我的应用程序中有一个用户系统,它来自userena:

class FindUrGeekUserProfile(UserenaBaseProfile):
user         = models.OneToOneField( User, unique = True, verbose_name    ='userData', related_name='myProfile',db_index = True)
type         = models.CharField(max_length = 2, choices = USER_TYPE, blank = True, null = True, db_index = True)

def __unicode__(self):
    return 'Name: ' + self.user.username + ' Type: ' + self.type

当用户在我的网站上注册时,他会完成登录,密码和电子邮件字段。

用户第一次通过我的网站连接时,他会看到一个页面询问他的用法类型:Type1或Type2 ......

我想在每个login_registered视图中验证用户是否已定义其类型。到目前为止,我创建了一个我在每个注册视图中使用的函数:

def checkUserType(user):
    if(user.type != None)
        return True
    else:
        retur False

@login_registered
def myView(request):
    if (checkUserType(request.user)):
        Continue....
    else:
        return redirect('setUserType')  # Page where the user will set his type

Django有更好的方法吗?使用一些内置功能?

谢谢你的帮助

1 个答案:

答案 0 :(得分:0)

至少有一种更好的方式:

@login_registered
def myView(request):
    if not checkUserType(request.user):
        return redirect('setUserType')  # Page where the user will set his type

    # user has the type, continue

此外,您可以write a custom middleware,并在process_request()中执行检查/重定向。它可能看起来像:

from django import http
from django.core.urlresolvers import reverse


class SetUserTypeMiddleware(object):
    urls = ['/some/path/that/requires/user/type/',]

    def process_request(self, request):
        if not request.user.is_authenticated():
            return

        for url in urls: # customize url matching to your taste
            if url in request.path_info:
                return http.HttpResponseRedirect(reverse('setUserType'))

中间件是一个很酷的功能,它简单而强大。只是不要忘记在settings.MIDDLEWARE_CLASSES注册它们。