url django中呈现的slug不正确

Pyt*_*sta 2 python django django-models django-forms python-3.x

为什么我总是%2F在生成的slugs网址中有额外的内容?

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

某处出了点问题,但我似乎无法发现它

在我看来,我<a href = "{{ group.get_absolute_url }}">...用来获取slu .. 现在,这可以工作,但输出上述问题.如果我这样做href = "{% url 'group' group.slug %}会抛出一个错误,它无法找到反向匹配.

示例:group的标题是a groupurl../%2Fgroup/a-group/

在urls.py中

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

模型

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})
Run Code Online (Sandbox Code Playgroud)

形成

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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Ala*_*air 5

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

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

请注意,我也有

  • 已删除\d,因为\w已包含数字0-9
  • 使用url()(Django 1.8+的最佳实践)并命名为url模式.这应该有希望通过{% url %}标签工作来反转url .使用group.get_absolute_url在你的模板是好的,虽然,有没有必要使用URL标记,如果你不想.