我有一个company
模型,该模型的每个实例都有一个名为admin
的用户外键。
我正在写一个允许公司管理员管理其公司的视图:
urls.py
:
path('admin/crn=<company_spec_url>', CompanyAdminView.as_view(), name="CompanyAdminView"),`
views.py
:
class CompanyAdminView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
template_name = 'company_admin.html'
def test_func(self):
company = Company.objects.filter(crn=context['company_spec_url'])[0]
return company.admin == self.user
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['company'] = Company.objects.filter(crn=context['company_spec_url'])[0]
context['announcements'] = CompanyAnnouncement.objects.filter(company__crn=context['company_spec_url'])
return context
get_context_data
位工作正常,问题出在test_func
中。显然,只应允许公司的管理员来管理公司,所以我试图进入test_func
,以便对其进行测试。
test_func
中的代码当前无法使用,因为它无权访问context
。最佳做法是:调用一次super().get_context_data
,并将context
设为全局变量,以便可以从test_func
访问它-两次调用super().get_context_data
,一次在{{1 }},然后在get_context_data
中输入一次,还是其他完全输入?
我尝试查看请求中的GET dict,但它为空。我可以自己解析test_func
中的url来获取参数,但这似乎并不是“正确”的方法。
答案 0 :(得分:3)
位置和命名参数分别存储在self.args
和self.kwargs
中,因此您可以使用以下命令进行访问:
class CompanyAdminView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
# ...
def test_func(self):
company = Company.objects.filter(crn=self.kwargs['company_spec_url'])[0]
return company.admin == self.user
请注意,上面的操作可能很棘手:在这里,如果多个公司拥有相同的crn
,则您将让(可能是随机的)订单决定您选择的公司,以及该admin
是否为self.user
。此外,这将导致两个查询。
class CompanyAdminView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
# ...
def test_func(self):
return Company.objects.filter(
crn=self.kwargs['company_spec_url']
admin=self.user
).exists()
使用上述方法,我们检查URL中是否有Company
的参数为crn
,而self.user
的地址为admin
。