【问题标题】:Django empty self.args in ListView when <pk> in urls.py当 <pk> 在 urls.py 中时,Django 在 ListView 中清空 self.args
【发布时间】:2018-02-17 12:51:24
【问题描述】:

我想获取 Sample 的项目名称。它应该在 self.args 中,因为我的 urls.py 看起来像那样(有很多 url,所以我只会发布重要的):

项目/urls.py

app_name = 'projects'
urlpatterns = [
    url(r"^$", ProjectListView.as_view(), name="projects_list"),
    url(r"^(\w+)/robjects/", include("robjects.urls")),
    url(r"^(\w+)/tags/$", TagsListView.as_view(), name="tag_list"),
...
]

robjects/urls.py

app_name="robjects"
urlpatterns = [
...
    url(r'^(?P<pk>[0-9]+)/samples/', include("samples.urls")),
]

samples/urls.py

app_name="samples"
urlpatterns = [
    url(r'^list/$', SampleListView.as_view(), name='sample_list_view'),
    url(r'^create/$', SampleCreateView.as_view(), name='sample_create_view'),
    url(r'^(?P<sample_id>[0-9]+)/update/$', SampleUpdateView.as_view(), name='sample_update'),
    url(r'^(?P<sample_id>[0-9]+)/delete/$', SampleDeleteView.as_view(), name='sample_delete'),
]

我想获取 project_name,即 projects/urls.py 的 '(\w+)' 部分。为此,我在 samples/views.py 中编写了该代码。我试图做 project_name = self.args[0] 但我的 args 是空的。

类 SampleListView(ListView): 型号 = 样品 template_name = "samples/samples_list.html"

    def get(self, request, *args, **kwargs):
        """A base view for displaying a list of objects."""
        # check if project exists
        try:
            pk = kwargs['pk']
            robject = Robject.objects.get(id=pk)
            # add project to view attributes
            self.robject = robject
        except Robject.DoesNotExist:
            raise Http404
        print(self.args) # it should be a project name here
        return super(SampleListView, self).get(request, *args, **kwargs)

    def get_queryset(self, *args, **kwargs):
        """
        Overwrite orginal qs and add filtering by robject
        """

        # original queryset
        qs = super().get_queryset(*args, **kwargs)
        print('args, ',self.args)
        print('kwargs', self.kwargs)
        pk = self.kwargs['pk']
        robject = Robject.objects.get(id=pk)
        return qs.filter(robject=self.robject)

这是输出:

args,  ()
kwargs {'pk': '27'}

我想通过 robject_id 和 project_name 过滤我的 qs,对于 robject_id 它工作正常。我不知道如何获取 project_name 进行过滤。

此外,我不得不说,在标签中(“网址中不包含”)我使用 self.argss[0] 完成了它,它有效,但仅形成标签列表视图。

代码如下:

class TagsListView(LoginRequiredMixin, ListView):
    model = Tag
    template_name = "tags/tag_list.html"

    def get(self, request, *args, **kwargs):
        """A base view for displaying a list of objects."""
        # check if project exists
        try:
            project = Project.objects.get(name=args[0]) # it works fine
            # add project to view attributes
            self.project = project
        except Project.DoesNotExist:
            raise Http404
        return super(TagsListView, self).get(request,*args, **kwargs)

这是我发现的:

当我这样定义我的网址时:

url(r"^(\w+)/robjects/samples/$", SampleListView.as_view(), name='sample_list_view'),

一切正常。在我的 args 中是 project_name,我可以通过 self.args[0]

捕获它

但是当我添加到我的参数为空时,

url(r"^(\w+)/robjects/(?P<pk>[0-9]+)/samples/$", SampleListView.as_view(), name='sample_list_view'),

当我像这样定义两个 kwargs 时:

url(r"^(?P<project_name>[\w\-]+)/robjects/(?P<pk>[0-9]+)/samples/list/$",SampleListView.as_view(), name='sample_list_view'),

args 为空 - 我所期望的,kwargs 都可以并传递给视图

这是一个 Django 错误还是有什么方法可以使用 self.args ?它们被 kwargs 覆盖了吗?

感谢您的帮助!

【问题讨论】:

    标签: python django listview django-views django-class-based-views


    【解决方案1】:

    它看起来像一个错误。我对其进行了测试,当您将 args 和 kwargs 传递到您的网址时,例如:

    url(r"^(\w+)/test1/(?P<pk>[0-9]+)/test2/$", TestListView.as_view(), name='list_view'),
    

    然后 ListView 为 args 返回空元组(它不应该)。 当您仅将 args 或仅 kwargs 传递到 url 时,它可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-18
      • 2014-08-01
      • 2020-11-24
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 2015-10-10
      相关资源
      最近更新 更多