4

(GET パラメーターの代わりに) URL の page パラメーターを使用してページネーションを実行しようとしています。また、ページネーションを複数の異なるテンプレートで共有するコードにしたいと考えています。

それを考えると、私はこのようなことをする必要があると思います:

urls.py:

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

テンプレート/alias.html:

<div>...stuff...</div>
{% include "paginator.html" %}

templates/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>
...

とはsomemagic?

ページを設定することを除いて、URLを同じに保ちたいとしますpage_obj.previous_page_number

4

2 に答える 2

2

編集:

somemagic現在のビューの名前を持つ変数である必要があります。

これを試して:

{% with request.path_info|resolve_url_name as current_view %}
    {% url current_view page_obj.previous_page_number object.id %}
{% endwith %}

これは、django-snippets のコードで動作させることができます:

  1. 変数解決 URL テンプレート タグ{% url %} タグがコンテキストから変数を解決するようにします。
  2. URL をビュー名に解決する関数resolve_to_name(path)は のビュー名を返しますpath。この関数を使用するフィルターを作成するだけです。

このソリューションは、次のような URL では機能しません。

'alias/param1_regexp/param2_regexp/page;(?P<page>[0-9]+)/(?P<id>.*)$'

param1とparam2についての手がかりがないからです。

上記の django-snippets を変更して、この種の URL を機能させることができます。

最初のスニペットの変更:

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

2 番目のスニペットの変更

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 はビューの名前とそのパラメーターをタプルとして返し、new {% url myvar %}はこのタプルを取得し、それを使用してビュー名とそのパラメーターでパスを逆にします。

フィルター アプローチが気に入らない場合は、カスタム ミドルウェアを使用して行うこともできます。


前の回答

django-pagination を確認する必要があります。これは非常に優れた django アプリケーションであり、使いやすく、作業を完了できます。

Django のページネーションでは、イテラブルをページネーションするコードは次のようになります。

{% load pagination_tags %}

{% autopaginate myiterable 10 %} <!-- 10 elements per page -->

{% for item in myiterable %} RENDERING CONTENT {% endfor %}

{% paginate %} <!-- this renders the links to navigate through the pages -->

myiterableは、リスト、タプル、クエリセットなど、反復可能なものであれば何でもかまいません。

googlecode のプロジェクト ページ: http://code.google.com/p/django-pagination/

于 2009-08-26T07:53:17.373 に答える
0

以下のようなものになります。id の意味がわからないので、一般的なオブジェクト id を付けただけです。URL の構文は {% url view_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>
于 2009-08-02T04:06:51.330 に答える