Django,将url参数纳入视图

时间:2018-08-16 10:35:43

标签: django django-views django-urls

我有一个company模型,该模型的每个实例都有一个名为admin的用户外键。

我正在写一个允许公司管理员管理其公司的视图:

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,一次在{{1 }},然后在get_context_data中输入一次,还是其他完全输入?

我尝试查看请求中的GET dict,但它为空。我可以自己解析test_func中的url来获取参数,但这似乎并不是“正确”的方法。

1 个答案:

答案 0 :(得分:3)

位置命名参数分别存储在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

请注意,上面的操作可能很棘手:在这里,如果多个公司拥有相同的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()

使用上述方法,我们检查URL中是否有Company的参数为crn,而self.user的地址为admin