Django,获取 url 参数进入视图
Django, getting url parameter into view
我有一个 company
模型,它的每个实例都有一个名为 admin
的 foreign_key 给用户。
我正在编写一个视图以允许公司管理员管理他们的公司:
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 来获取参数,但它似乎不像 'correct' 那样。
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
具有 admin
中的参数。
我有一个 company
模型,它的每个实例都有一个名为 admin
的 foreign_key 给用户。
我正在编写一个视图以允许公司管理员管理他们的公司:
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 来获取参数,但它似乎不像 'correct' 那样。
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
具有 admin
中的参数。