Изменить:
Вам нужно, чтобы somemagic
была переменной с именем текущего представления.
Попробуй это:
{% with request.path_info|resolve_url_name as current_view %}
{% url current_view page_obj.previous_page_number object.id %}
{% endwith %}
Вы можете заставить это работать с некоторым кодом из фрагментов django:
- Тег шаблона URL разрешения переменной Заставляет тег {% url %} разрешать переменные из контекста.
- Разрешить URL-адреса для имени представления Функция
resolve_to_name(path)
возвращает имя представления для path
. Вам просто нужно создать фильтр, который использует эту функцию.
Это решение не будет работать с такими URL-адресами, как:
'alias/param1_regexp/param2_regexp/page;(?P<page>[0-9]+)/(?P<id>.*)$'
потому что вы понятия не имеете о param1 и param2.
Можно внести изменения в приведенные выше фрагменты django, чтобы такие 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
Изменения второго фрагмента
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/
person
Guillem Gelabert
schedule
26.08.2009