Django,让url参数进入 View

标签 django django-views django-urls

我有一个 company 模型,它的每个实例都有一个名为 admin 的 foreign_key 给用户。

我正在编写一个 View 以允许公司管理员管理他们的公司:

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

最佳答案

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,那么您将让一个(可能是随机的)订单决定您选择哪家公司,以及该 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 作为 管理

关于Django,让url参数进入 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51875008/

相关文章:

django - 配置不正确 : Error importing middleware app. 中间件: "cannot import name get_host"

python - 'form'的值必须继承自 'BaseModelForm'

Django:DetailView 从外键获取对象

python - Django:进行数据库查询时出现UnboundLocalError

django - include()获得了意外的关键字参数 'app_name'

django - 错误 URL 重定向

django - django bulk_create 查询中的外键关系?

python - 向 Django 数据库添加元素

python - Django Rest Framework - 使用 model.ModelViewSet 更新模型

Django 如何在模板中使用 block