url django 中呈现的 slug 不正确

Posted

技术标签:

【中文标题】url django 中呈现的 slug 不正确【英文标题】:rendered slugs are not correct in url django 【发布时间】:2015-11-24 02:48:55 【问题描述】:

为什么我生成的 slugs url 中总是有一个额外的 %2F

当我在终端中打印出来时,所有的 slug 都在下面正确生成,但我不知道为什么 url 有额外的 %2F

某处有问题,但我似乎无法发现它

在我看来,我正在使用<a href = " group.get_absolute_url ">... 来获取蛞蝓。现在,这可行,但会输出上述问题。如果我这样做 href = "% url 'group' group.slug % 这会引发一个错误,即找不到反向匹配。

示例:组的标题是a group,网址将是../%2Fgroup/a-group/

在 urls.py 中

 (r'^/group/(?P<slug>[-\w\d]+)/$', "group"),

型号

class BlogGroup(models.Model):

    title = BleachField()
    image = models.ImageField(upload_to="uploads/group_images", default="uploads/group_images/none/none.jpg")
    created = models.DateTimeField(default = datetime.now)
    slug = models.SlugField(unique = True)

    def __str__(self):

        return self.title 

    def get_absolute_url(self):
        return reverse("blog.views.group", kwargs = 'slug':self.slug)

表格

class BlogGroupForm(forms.ModelForm):


    def __init__(self, *args, **kwargs):

        super(BlogGroupForm, self).__init__(*args, **kwargs)
        self.fields["title"].requried = True
        self.fields["image"].required = True
        self.fields["title"].widget = forms.TextInput()

    class Meta:
        model = BlogGroup
        fields = ["title", "image", "slug"]

    def save(self, commit = False):

        instance = super(BlogGroupForm, self).save(commit = False)
        return truncate_slug(instance, BlogGroup)

utils.py

from django.utils.text import slugify
import itertools

def truncate_slug(instance, arg):

    length = arg._meta.get_field('slug').max_length
    instance.slug = original_slug = slugify(instance.title)[:length]

    for x in itertools.count(1):
        if not arg.objects.filter(slug = instance.slug).exists():
            break
        instance.slug = "%s-%d" % (original_slug[:length - len(str(x)) -1], x)
    instance.save()
    return instance

【问题讨论】:

【参考方案1】:

您的正则表达式开头有一个正斜杠。如果你删除它,它应该会阻止%2f(注意%2f是一个url编码的正斜杠)。

url(r'^group/(?P<slug>[-\w]+)/$', "group", name="group"),

请注意,我也有

删除了\d,因为\w 已经包含数字0-9 使用url()(Django 1.8+ 的最佳实践)并命名了 url 模式。这应该有望使使用 % url % 标记反转 url 工作。在你的模板中使用group.get_absolute_url 很好,如果你不想使用 url 标记,则无需使用。

【讨论】:

以上是关于url django 中呈现的 slug 不正确的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中正确使用 slug url?

Django:如果 slug 错误,则重定向 url

Django中的Slug Url正则表达式

Django 2.0 slug urls.py 意外关键字参数“slug”

django中字母数字(slug)字符串的网址模式

Django urls.py 没有呈现正确的模板