Django,查看 url 参数

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来获取参数,但这似乎不是“正确”的方法。

Wil*_*sem 5

位置命名参数存储在self.argsself.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,那么你就会让一个(可能是随机的)顺序决定你选择什么样的公司,以及这是否adminself.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作为crnURL 中的参数,并且self.user作为admin.