请告诉我正确的方式来使用,并且是指一个slugfield在Django 1.3

问题描述:

请告诉我正确的方式来使用,并且是指一个slugfield在Django 1.3请告诉我正确的方式来使用,并且是指一个slugfield在Django 1.3

例如下面的代码应通过蛞蝓链接到一个通用视图但是会收到NoReverseMatch错误。

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

从我的理解这句话的错误在于然而模板是一个新手,并尝试过在{%URL single_post金属块= post.slug%}许多不同的变化,这可能并非如此。

有人可以请解释为什么会发生这种情况,以便我可以了解问题所在以及如何解决。

伊夫试图{%URL single_post蛞蝓= post.slug%},{%URL single_post蛞蝓%} {%URL single_post蛞蝓= post.slug%}和许多其他变化

所有帮助感激

模型

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

网址

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 %} 

您的正则表达式不允许使用数字值。尝试:

(?P<slug>[\w-]+) 
+0

我试过你的建议,但是没有运气。正则表达式绝对是问题,还是可能来自另一个领域。依你的意见?谢谢 – Stu 2011-04-19 14:43:18

+0

嗯。正则表达式似乎是这里的罪魁祸首。 [a-z - ] +不匹配:post-2。 [ - \ w] +在我的Django应用程序中执行。 \ w根据Python正则表达式语法参考匹配[a-zA-Z0-9_]:http://docs.python.org/library/re.html#re-syntax – Brandon 2011-04-19 14:55:10

+0

非常感谢您的帮助。你是对的。 – Stu 2011-04-19 21:35:50

在模板中,假设post是你的模型的实例:

{% url single_post post.slug %} 

您的网址的正则表达式应该如下所示:

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

为了检验上述正则表达式,尝试直接在浏览器中使用各种有效的slu access访问一些帖子,看看它们是否有效。一旦完成,开始测试url名称。

甲蛞蝓值可以包含任何a-zA-Z0-9_-。前3个由特殊字符w表示,由于-本身是一个特殊字符,因此我们需要使用反斜杠\来表示它们。所以正确的表达式变成

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

至少这就是我的情况。

在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

您可以在URL中使用正则表达式。潘岳:

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

在早期版本中它是[-\w]+,但我想在Python3 \ W匹配非ASCII字符像变音符号。