我有一个 company
模型,它的每个实例都有一个名为 admin
的 foreign_key 给用户。
我正在编写一个 View 以允许公司管理员管理他们的公司:
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
两次,一次在 get_context_data
中,一次在 test_func
中,或者完全是其他什么?
我尝试查看请求中的 GET 字典,但它是空的。我可以自己解析 test_func
中的 url 来获取参数,但这似乎不是“正确”的方法。
最佳答案
positional 和 named 参数分别存储在 self.args
和 self.kwargs
中,所以你可以通过以下方式访问它:
class CompanyAdminView(LoginRequiredMixin, UserPassesTestMixin, TemplateView):
# ...
def test_func(self):
company = Company.objects.filter(crn=<b>self.kwargs['company_spec_url']</b>)[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']
<b>admin=self.user</b>
).exists()
通过上面的代码,我们检查是否有一个 Company
在 URL 中具有 crn
参数,以及 self.user
作为 管理
。
关于Django,让url参数进入 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51875008/