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' 那样。

positionalnamed参数分别存放在self.argsself.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,那么您将让一个(可能是随机的)订单决定您选择哪家公司,以及是否 adminself.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 中的参数。