Ale*_*lex 2 django django-urls django-views
我有一个company
模型,它的每个实例都有一个为admin
用户命名的外键。
我正在编写一个视图以允许公司管理员管理他们的公司:
urls.py
:
path('admin/crn=<company_spec_url>', CompanyAdminView.as_view(), name="CompanyAdminView"),`
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
该get_context_data
位工作正常,问题出在test_func
. 显然,应该只允许公司的管理员管理公司,所以我试图进入test_func
,以便对其进行测试。
中的代码test_func
当前不起作用,因为它无法访问context
. 最佳实践是:调用super().get_context_data
一次,并创建context
一个全局变量,以便可以从以下位置访问它test_func
- 调用super().get_context_data
两次,一次输入get_context_data
一次test_func
,或者完全调用其他方法?
我试过查看请求中的 GET dict,但它是空的。我可以test_func
自己解析其中的 url来获取参数,但这似乎不是“正确”的方法。
的位置和命名参数存储在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
Run Code Online (Sandbox Code Playgroud)
注意上面可能会非常棘手:这里如果多家公司有相同的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()
Run Code Online (Sandbox Code Playgroud)
通过上面我们检查是否有一个Company
作为crn
URL 中的参数,并且self.user
作为admin
.
归档时间: |
|
查看次数: |
3251 次 |
最近记录: |