Django:如何获取当前URL标记名(用于分页)?

Django:如何获取当前URL标记名(用于分页)?,django,django-templates,pagination,django-urls,Django,Django Templates,Pagination,Django Urls,我正在尝试使用URL中的page参数(而不是GET参数)进行分页。我还希望我的分页是跨多个不同模板共享的代码 考虑到这一点,我认为我需要这样做: URL.py: url(r'^alias/page;(?P<page>[0-9]+)/(?P<id>.*)$', alias.get, name="alias"), url(r'^alias/page;(?P[0-9]+)/(?P.*),alias.get,name=“alias”), tempaltes/alias.htm

我正在尝试使用URL中的page参数(而不是GET参数)进行分页。我还希望我的分页是跨多个不同模板共享的代码

考虑到这一点,我认为我需要这样做:

URL.py:

url(r'^alias/page;(?P<page>[0-9]+)/(?P<id>.*)$', alias.get, name="alias"),
url(r'^alias/page;(?P[0-9]+)/(?P.*),alias.get,name=“alias”),
tempaltes/alias.html:

<div>...stuff...</div>
{% include "paginator.html" %}
…东西。。。
{%include“paginator.html”%}
模板/paginator.html:

{% if page_obj.has_previous or page_obj.has_next %}
{% load filters %}
<div class="pagination clear">
    {% if page_obj.has_previous %}
        <a href="{% url somemagic %}" class="prev">&lsaquo;&lsaquo; previous</a>
...
{%if page_obj.has_previous或page_obj.has_next%}
{%load filters%}
{%如果页面_obj.has_previous%}
...
什么是魔法


假设我想保持我的url不变,只是设置了页面
page\u obj。上一个页面\u编号将如下所示。除了我不知道你所说的id是什么意思,所以我只放了一个通用对象id。url的语法是{%url视图_name param1 param2…%}

{% url alias page_obj.previous_page_number object.id %}
根据您的需要进行更新:

{% url alias page_obj.previous_page_number object.id as prev_url %}
{% include "paginator.html" %}
...
{% if page_obj.has_previous %}
        <a href="{{prev_url}}" class="prev">&lsaquo;&lsaquo; previous</a>
{%url别名page\u obj.previous\u page\u number object.id作为prev\u url%}
{%include“paginator.html”%}
...
{%如果页面_obj.has_previous%}
编辑:

from django.template import defaulttags, VariableDoesNotExist, Variable

class ResolvingURLNode(defaulttags.URLNode):
    def render(self, context):
        original_view_name = self.view_name
        try:
            resolved = Variable(self.view_name).resolve(context)
            if len(resolved) > 1:                
                self.view_name = resolved[0]
                if resolved[1]:
                    self.args = [Variable(arg) for arg in resolved[1]]
            elif len(resolved) > 0:
                self.view_name = resolved[0]
            else:
                self.view_name = resolved

        except VariableDoesNotExist:
            pass
        ret = super(defaulttags.URLNode, self).render(context)
        # restore view_name in case this node is reused (e.g in a loop) in
        # which case the variable might resolve to something else in the next iteration)
        self.view_name = original_view_name
        return ret

defaulttags.URLNode = ResolvingURLNode
您需要
somemagic
成为具有当前视图名称的变量

试试这个:

{% with request.path_info|resolve_url_name as current_view %}
    {% url current_view page_obj.previous_page_number object.id %}
{% endwith %}
您可以使用django代码段中的一些代码来实现这一点:

  • 使{%url%}标记从上下文解析变量
  • 函数
    resolve\u to_name(path)
    返回
    path
    的视图名称。您只需要创建一个使用此函数的过滤器
  • 此解决方案不适用于以下URL:

    'alias/param1_regexp/param2_regexp/page;(?P<page>[0-9]+)/(?P<id>.*)$'
    
    第二次代码段修改

    from django.core.urlresolvers import RegexURLResolver, RegexURLPattern, Resolver404, get_resolver
    
    __all__ = ('resolve_to_name',)
    
    def _pattern_resolve_to_name(self, path):
        match = self.regex.search(path)
        if match:
            name = ""
            if self.name:
                name = self.name
            elif hasattr(self, '_callback_str'):
                name = self._callback_str
            else:
                name = "%s.%s" % (self.callback.__module__, self.callback.func_name)
            if len(match.groups()) > 0:
                groups = match.groups()
            else:
                groups = None
            return name, groups
    
    
    def _resolver_resolve_to_name(self, path):
        tried = []
        match = self.regex.search(path)
        if match:
            new_path = path[match.end():]
            for pattern in self.url_patterns:
                try:
                    resolved = pattern.resolve_to_name(new_path)
                    if resolved:
                        name, groups = resolved
                    else:
                        name = None
                except Resolver404, e:
                    tried.extend([(pattern.regex.pattern + '   ' + t) for t in e.args[0 ['tried']])
                else:
                    if name:
                        return name, groups
                    tried.append(pattern.regex.pattern)
            raise Resolver404, {'tried': tried, 'path': new_path}
    
    
    # here goes monkeypatching
    RegexURLPattern.resolve_to_name = _pattern_resolve_to_name
    RegexURLResolver.resolve_to_name = _resolver_resolve_to_name
    
    
    def resolve_to_name(path, urlconf=None):
        return get_resolver(urlconf).resolve_to_name(path)
    
    基本上,resolve_to_name以元组的形式返回视图的名称及其参数,新的
    {%url myvar%}
    获取该元组并使用它来反转具有视图名称及其参数的路径

    如果您不喜欢过滤器方法,也可以使用自定义中间件来完成


    先前的答案

    您应该检查django分页,这是一个非常好的django应用程序,易于使用并完成了工作

    使用django分页,对iterable进行分页的代码为:

    {%load pagination_tags%}

    {%automagine myiterable 10%}

    {%for myiterable%}中的项目
    呈现内容
    {%endfor%}

    {%paginate%}

    myiterable可以是任何可编辑的内容:列表、元组、查询集等

    谷歌代码上的项目页面:

    您是否已经将django分页作为一种替代选项?是的,它使用?page=4,但我有其他永久性get参数,它们会妨碍我。您的其他get参数是“page”吗?django分页将保持所有其他get参数不变。我在每个应用程序上都使用它。如果你看这些视频,你不会输的。但是pagination.html将包含在许多其他URL的其他文件中(使用不同的模板名称)。所以我不能把“alias”放在那里。是的,我用了它,但它有?page=作为分页的方式,这对我来说不起作用,因为我的url已经有一些重要的查询参数需要保留。有趣的是,为什么这种类型的{%url%}在实际的django中不存在?而对于中间件方法,它是否具有较小的侵入性?重写核心{%url%}似乎可能会破坏某些东西。使用中间件,而不是使用request.path_info | resolve_to_url,您将在中间件进程_request(request)方法中调用resolve_to_url(request.path_info),并将其作为自定义变量添加到请求中。然后它将在项目的任何模板中可用。如果您有同名的视图和变量,则新的{%url%}将失败。可以通过创建自定义模板标记{%myurl%}并根据需要使用此模板标记或默认模板标记来避免这种情况。