我有两个用户组,“所有者”和“员工”。他们可以使用相同的表单输入数据,但我希望他们在成功时被定向到不同的列表视图。我有一个有效的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
如何访问用户?
答案 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