Как я создаю реверс/URL Django с помощью запроса args?

У меня есть URL как http://example.com/depict?smiles=CO&width=200&height=200 (и с несколькими другими дополнительными аргументами)

Мой urls.py содержит:

urlpatterns = patterns('',
    (r'^$', 'cansmi.index'),
    (r'^cansmi$', 'cansmi.cansmi'),
    url(r'^depict$', cyclops.django.depict, name="cyclops-depict"),

Я могу перейти к тому URL и добраться 200x200 PNG, который был создан, таким образом, я знаю ту часть работы.

В моем шаблоне от "cansmi.cansmi" ответа я хочу создать URL для именованного шаблона "Циклоп - изображают", учитывая некоторые параметры запроса. Я думал, что мог сделать

{URL % Циклоп - изображают smiles=input_smiles width=200 height=200%}

где "input_smiles" является входом к шаблону через представление формы. В этом случае это - строка "CO", и я думал, что это создаст URL как тот в вершине.

Этот шаблон перестал работать с TemplateSyntaxError:

Пойманный исключение при рендеринге: Реверс для 'Циклопа - изображает' с аргументами' ()' и аргументами ключевого слова '{'улыбки': u'CO', 'высота': 200, 'ширина': 200} 'не найденный.

Это - сообщение довольно распространенной ошибки и здесь на StackOverflow и в другом месте. В каждом случае я нашел, люди использовали их с параметрами в regexp пути URL, который не имеет место, я имею, где параметры входят в запрос.

Это означает, что я делаю его неправильно. Как я делаю его правильно? Таким образом, я хочу создать полный URL, включая путь и параметры запроса, с помощью чего-то в шаблоне.

Для ссылки,

% python manage.py shell
Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.core.urlresolvers import reverse
>>> reverse("cyclops-depict", kwargs=dict())
'/depict'
>>> reverse("cyclops-depict", kwargs=dict(smiles="CO"))
Traceback (most recent call last):
  File "", line 1, in 
  File "/Library/Python/2.6/site-packages/django/core/urlresolvers.py", line 356, in reverse
    *args, **kwargs)))
  File "/Library/Python/2.6/site-packages/django/core/urlresolvers.py", line 302, in reverse
    "arguments '%s' not found." % (lookup_view_s, args, kwargs))
NoReverseMatch: Reverse for 'cyclops-depict' with arguments '()' and keyword arguments '{'smiles': 'CO'}' not found.

29
задан John Carter 3 August 2014 в 00:10
поделиться

1 ответ

Ваше регулярное выражение не имеет держателей (поэтому вы получаете NoReverseMatch):

url(r'^depict$', cyclops.django.depict, name="cyclops-depict"),

Вы можете сделать это так:

{% url cyclops-depict %}?smiles=CO&width=200&height=200

URLconf search does not include GET or POST parameters

Или, если вы хотите использовать тег {% url %}, вы должны перестроить ваш шаблон url на что-то вроде

r'^depict/(?P<width>\d+)/(?P<height>\d+)/(?P<smiles>\w+)$' 

тогда вы можете сделать что-то вроде

{% url cyclops-depict 200 200 "CO" %}

Follow-up:

Простой пример для пользовательского тега:

from django.core.urlresolvers import reverse
from django import template
register = template.Library()

@register.tag(name="myurl")
def myurl(parser, token):
    tokens = token.split_contents()
    return MyUrlNode(tokens[1:])

class MyUrlNode(template.Node):
    def __init__(self, tokens):
        self.tokens = tokens
    def render(self, context):
        url = reverse('cyclops-depict')
        qs = '&'.join([t for t in self.tokens])
        return '?'.join((url,qs))

Вы можете использовать этот тег в ваших шаблонах так:

{% myurl width=200 height=200 name=SomeName %}

и, надеюсь, он должен вывести что-то вроде

/depict?width=200&height=200&name=SomeName
20
ответ дан 28 November 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: