需要success_url根据CreateView中的用户组而有所不同

时间:2015-08-06 16:04:03

标签: django

我有两个用户组,“所有者”和“员工”。他们可以使用相同的表单输入数据,但我希望他们在成功时被定向到不同的列表视图。我有一个有效的CreateView:

class ServiceAddBlankView(
    views.LoginRequiredMixin,
    views.FormValidMessageMixin,
    views.SetHeadlineMixin, 
    generic.CreateView
):

    form_class = ServiceForm
    headline = 'Add Service'
    form_valid_message = "Service Entered!"
    model = Service
    template_name = 'wesapp/service_add.html'
    success_url = '/wesapp/service_list/'

但是,我希望success_url因用户组而异。 如果用户组是“所有者”,我希望success_url/wesapp/service_list/;如果用户组为“员工”,我希望为/wesapp/services/

我试过这个,但它根本找不到任何success_url:

owner_group = Group.objects.get(name="Owner").user_set.all()
employee_group = Group.objects.get(name="Employee").user_set.all()
class ServiceAddBlankView(
    views.LoginRequiredMixin,
    views.FormValidMessageMixin,
    views.SetHeadlineMixin, 
    generic.CreateView
):

    form_class = ServiceForm
    headline = 'Add Service'
    form_valid_message = "Service Entered!"
    model = Service
    template_name = 'wesapp/service_add.html'
    if user in owner_group:
        success_url = '/wesapp/services/'
    if user in employee_group:
        success_url = '/wesapp/service_list/'

错误是:

name 'user' is not defined

如何访问用户?

2 个答案:

答案 0 :(得分:1)

无法像您一样访问类定义中的用户。相反,CreateView有一个get_success_url方法,可让您动态设置成功视图。

在该方法中,您可以使用self.request访问请求,因此您可以使用self.request.user访问登录用户。

class ServiceAddBlankView(generic.CreateView):

    def get_success_url(self):
        if self.request.user.groups.filter(name="Owner").exists():
            return '/wesapp/services/'
        elif self.request.user.groups.filter(name="Employee").exists():
            return '/wesapp/service_list/'
        else:
            return '/fallback/url/'

我已更改查询以检查用户是否在所有者或员工组中。在原始代码中,您不必要地加载每个所有者和员工。请注意,如果用户是所有者并且是员工,我的代码会略有不同 - 如果这很重要,则需要对其进行更改。

答案 1 :(得分:0)

Django的请求对象可以访问该用户。请参阅此处记录的request.user:

https://docs.djangoproject.com/en/1.8/ref/request-response/#django.http.HttpRequest.user