Какой правильный способ использования и ссылки на слагфилд в django 1.3 - PullRequest
3 голосов
/ 19 апреля 2011

Как правильно использовать и ссылаться на слаг-поле в django 1.3

, например, следующий код должен связывать через slug с общим представлением, однако получена ошибка NoReverseMatch.

Caught NoReverseMatch while rendering: Reverse for 'single_post' with arguments '('', u'post-2')' and keyword arguments '{}' not found.

Насколько я понимаю, это говорит о том, что ошибка заключается в том, что шаблон является новичком и перепробовал множество различных вариантов {% url single_post slug = post.slug%}, это может быть не так.

Может кто-нибудь объяснить, почему это происходит, чтобы я мог понять, в чем проблема и как ее исправить.

Я пытался {% url single_post slug = post.slug%}, {% url single_post slug%} {%url single_post slug = post.slug%} и многие другие варианты

Вся помощь очень ценится

модель

slug = models.SlugField(max_length=120, unique=True)

url

   url(r'^post/(?P<slug>[a-z-]+)/$', list_detail.object_detail,
         {'queryset': Post.objects.all(), 'template_object_name': 'post', 'slug_field': 'slug'}, name="single_post"),

шаблон

{% url single_post slug post.slug %}

Ответы [ 4 ]

7 голосов
/ 19 апреля 2011

Ваше регулярное выражение не допускает числовые значения.Попробуйте:

(?P<slug>[\w-]+)
2 голосов
/ 04 марта 2013

В Django 1.5 валидатор слагов использует это регулярное выражение:

slug_re = re.compile(r'^[-a-zA-Z0-9_]+$')

См. https://github.com/django/django/blob/stable/1.5.x/django/core/validators.py#L106

Вы можете использовать это регулярное выражение в urls.py:

url(r'^post/(?P<slug>[-a-zA-Z0-9_]+)/$', ...

В более ранних версиях это был [-\w]+, но я предполагаю, что в Python3 \ w соответствует не ascii символам, таким как умлаутс.

2 голосов
/ 08 января 2012

Значение слага может содержать любые a-z, A-Z, 0-9, _ и -. Первые 3 представлены специальным символом w, и поскольку - сам по себе является специальным символом, нам необходимо использовать для представления их обоих, используя обратную косую черту \. Таким образом, правильное выражение становится

url(r'^post/(?P<slug>[\w\-]+)/$', ...

По крайней мере, это то, что работает в моем случае.

2 голосов
/ 19 апреля 2011

В вашем шаблоне предполагается, что post является экземпляром вашей модели:

{% url single_post post.slug %}

Ваше регулярное выражение URL должно выглядеть следующим образом:

url(r'^post/(?P<slug>[\w-]+)/$', ...

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

...