Skip to main content
 首页 » 编程设计

python之在 Django url 中使用 Slugify

2024年08月28日29leader

我正在尝试创建 SEO 友好的网址,其中所有空格都替换为连字符。

这就是我在 Django 模板中使用 slugify 对 URL 进行“slugifying”的方式

<a href="{% url 'dj' dj_name=dj.name|slugify %}"> 

这是我的 urls.py

url(r'^top100/(?P<dj_name>[a-zA-Z0-9 \'&-]+)/$', views.dj, name='dj') 

这是我的看法

def dj(request, dj_name): 
    dj = DJ.objects.get(name=dj_name) 
    dj_song_list = Song.objects.filter(artist=dj, duplicate=False).order_by('-votes', '-release_date') 
    return render(request, 'hunt/dj.html', {'dj_song_list': dj_song_list, 'dj':dj} 

现在 url 中的 %20 已更改为 - 但我收到错误消息 DJ 匹配查询不存在。

这也会忽略 DJ 名称中的 &。例如,它将 DJ Above & Beyond 的 url 更改为 www.example.com/top100/above-beyond

请您参考如下方法:

您正在尝试请求一个对象使用其 slug 而不是其在数据库中的名称。 slug 是一个字符串,根据原始名称计算,您可以在 URL 中使用它(因为它对 SEO 友好)。但是如果你没有在数据库中的任何地方保存这个 slug,你就不能用它请求对象。事实上,不可能从 slug 中检索到原始名称。

Above & Beyond --> above-beyond --> Above @ Beyond  } 
                                --> above & beyond  } A lot of possibilities... 
                                --> ABOVE - BEYOND  }  
                                --> ... 

您需要使用 SlugField()并根据这个新字段得到想要的对象。简短示例:

class News(models.Model): 
    title = models.CharField('title', max_length=100) 
    slug = models.SlugField('slug', max_length=100, unique=True) 
    content = models.TextField('news content') 
 
    def get_absolute_url(self): 
        return reverse('news-view', args=(self.slug, )) 
 
# In the app/urls.py: 
from . import views 
urlpatterns = [ 
    url(r'^(?P<slug>.+)/$', view.news_detail, name='news-view'), 
    #... 
] 
 
# In the 'news_detail' view (app/views.py) 
news = get_object_or_404(News, slug=slug) 

在实践中,如果您想使用像 stackoverflow 这样的干净 URL,您可以使用模板标签 slugify:他们使用问题的 ID 从 URL 检索内容,但也有标题,您可以更改它,无论如何它都会重定向您。

http://stackoverflow.com/questions/21377984/using-slugify-in-django-urls 
                                   ^^^^^^^^ 
                                   ID used  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
                                            slug just for SEO purpose, not 
                                            used to retrieve from the db