【问题标题】:Passing URL variables to a class based view将 URL 变量传递给基于类的视图
【发布时间】:2017-06-02 04:17:24
【问题描述】:

我刚刚开始处理基于类的视图,我希望能够从我的类中的 URL 访问变量。但我很难让它发挥作用。我看到了一些答案,但它们都太短了,我发现它们没有任何帮助。

基本上我有一个网址

url(r'^(?P<journal_id>[0-9]+)/$',
    views.Journal_Article_List.as_view(), 
    name='Journal_Page'),

然后我想使用ListView 显示特定期刊中的所有文章。然而,我的文章表通过journal_id 链接到日志表。所以我最终做了以下事情

class Journal_Article_List(ListView):
    template_name = "journal_article_list.html"
    model = Articles
    queryset = Articles.objects.filter(JOURNAL_ID = journal_id)
    paginate_by = 12

    def get_context_data(self, **kwargs):
        context = super(Journal_Article_List, self).get_context_data(**kwargs)
        context['range'] = range(context["paginator"].num_pages)
        return context

但是,journal_id 并没有像在功能视图中那样传递。从我能找到的关于我阅读的主题的内容中,我可以使用

访问该变量
self.kwargs['journal_id']

但我有点迷茫我应该如何做到这一点。我已经在类中直接尝试过,它让我知道 self 不存在或通过覆盖 get_queryset,在这种情况下它告诉我 as_view() 只接受已经是类属性的参数。

【问题讨论】:

    标签: django class listview url django-generic-views


    【解决方案1】:

    如果你覆盖get_queryset,你可以从self.kwargs中的URL访问journal_id

    def get_queryset(self):
        return Articles.objects.filter(JOURNAL_ID=self.kwargs['journal_id'])
    

    你可以阅读更多关于 django 的动态过滤in the docs

    【讨论】:

    • 顺便说一句,我是否正确理解 .as_view() 生成我定义的类的一个实例,这也是我无法在主要位访问 .self.kwargs 的原因类,因为它描述了类的属性而不是特定的实例?
    • 你不能在类属性中访问self.kwargs,因为类是在服务器启动时加载的,在请求之前。正如你所说,as_view() 返回在 url 配置中使用的可调用视图,但这发生在 类加载之后。
    猜你喜欢
    • 2012-02-14
    • 2013-08-16
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 2017-02-25
    • 2011-09-05
    • 2012-04-25
    • 1970-01-01
    相关资源
    最近更新 更多