【问题标题】:Django, getting url parameter into viewDjango,获取 url 参数进入视图
【发布时间】:2018-08-16 10:35:43
【问题描述】:

我有一个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 dict,但它是空的。我可以只解析 test_func 中的 url 以自己获取参数,但这似乎不是“正确”的方法。

【问题讨论】:

    标签: django django-views django-urls


    【解决方案1】:

    positionalnamed 参数分别存储在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()

    通过上面我们检查是否有Company在URL中具有crn的参数,self.user作为admin

    【讨论】:

    • 谢谢。 crn 实际上是唯一的,但第二个选项要好得多,因为它可以捕获给定 crn 不存在的情况。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2012-12-11
    • 2021-05-18
    相关资源
    最近更新 更多