【问题标题】:Django URL page parameter and another parameterDjango URL页面参数和另一个参数
【发布时间】:2014-08-18 22:47:19
【问题描述】:

我该如何解决这个问题? 在我的模板中,我有这个:

<a href="{% url 'hp:category-filtered-page-blog' category=category page=page_obj.next_page_number %}">Next</a>

我想要一个带有另一个 url 参数的分页。 所以我的 CBV:

class CategoryFilteredBlogList(ListView):
    template_name = 'blog.html'
    context_object_name = 'posts'
    paginate_by = 1
    allow_empty = True

    def dispatch(self, *args, **kwargs):
        log_visitor(self.request, 'blog sort on category: {0}'.format(self.kwargs['category']))
        return super(CategoryFilteredBlogList, self).dispatch(*args, **kwargs)

    def get_queryset(self):
        print(self.kwargs['category'])
        self.category = get_object_or_404(Category, title=self.kwargs['category'])
        return Post.objects.filter(category__title__contains=self.category).order_by('-id')

    def get_context_data(self, **kwargs):
        context = super(CategoryFilteredBlogList, self).get_context_data(**kwargs)
        context['category'] = self.category
        return context

我的网址配置:

url(r'^blog/category/(?P<category>.+)$', CategoryFilteredBlogList.as_view(), name='category-filtered-blog'),
url(r'^blog/category/(?P<category>.+)/page/(?P<page>\w+)$', CategoryFilteredBlogList.as_view(), name='category-filtered-page-blog'),

它打印:'stuff/page/2' 但我只会'stuff'。

【问题讨论】:

    标签: django django-templates django-views django-urls


    【解决方案1】:

    问题是第一个 url 模式匹配所有内容,包括斜杠本身:

    url(r'^blog/category/(?P<category>.+)$', CategoryFilteredBlogList.as_view(), name='category-filtered-blog'),
    

    正在发生的事情的演示:

    >>> import re
    >>> pattern = re.compile('^blog/category/(?P<category>.+)$')
    >>> pattern.match('blog/category/stuff/page/2').group(1)
    'stuff/page/2'
    

    要修复它,只需删除第一个 url 模式,让第二个捕获 category

    演示:

    >>> pattern = re.compile('^blog/category/(?P<category>.+)/page/(?P<page>\w+)$')
    >>> pattern.match('blog/category/stuff/page/2').group(1)
    'stuff'
    

    如果您希望页面是可选的并允许像 blog/category/stuff 这样的 URL 工作,您可以交换 URL,以便您首先检查页面是否存在:

    url(r'^blog/category/(?P<category>.+)/page/(?P<page>\w+)$', CategoryFilteredBlogList.as_view(), name='category-filtered-page-blog'),
    url(r'^blog/category/(?P<category>.+)$', CategoryFilteredBlogList.as_view(), name='category-filtered-blog'),
    

    【讨论】:

    • 天哪!他说交换网址就可以了。 :-) 谢谢你,谢谢你的描述!!!
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2015-02-15
    • 2018-08-14
    • 1970-01-01
    • 2016-01-24
    • 2021-03-22
    相关资源
    最近更新 更多