django 1.6:创建 slug url

Posted

技术标签:

【中文标题】django 1.6:创建 slug url【英文标题】:django 1.6: create slug url 【发布时间】:2014-11-06 12:12:16 【问题描述】:

我有一个诊所模型,目前他们的链接看起来像这样

localhost:8000/clinic/1/

我想让它们看起来像这样

localhost:8000/clinic/Nice-Medical-Clinic/

我希望 slug 成为诊所的名称

这是models.py

class Clinic(models.Model):
    name = models.CharField(max_length=500)
    email = models.EmailField(blank = True, null = True)
    address = map_fields.AddressField(max_length=200
    website = models.CharField(max_length=50, blank = True, null = True)
    submitted_on = models.DateTimeField(auto_now_add=True, null = True, blank = True)

    def get_absolute_url(self):
      from django.core.urlresolvers import reverse
      return reverse('meddy1.views.clinicProfile', args=[str(self.id)])

这里是views.py

def clinicProfile(request, slug, id):
    clinic = Clinic.objects.get(id=id)
    doctors = Doctor.objects.all().order_by('-netlikes')

    d = getVariables()

    d.update('clinic': clinic, 'doctors': doctors, )
    return render(request, 'meddy1/clinicprofile.html', d)

urls.py

url(r'^clinic/(?P<id>\d+)/$', views.clinicProfile, name='clinicProfile'),

【问题讨论】:

【参考方案1】:

您需要将Slugfield 或 CharField 添加到您的模型中,并在您创建或编辑模型时填充它。

class Clinic(models.Model):
    name = models.CharField(max_length=500)
    ...
    slug = models.CharField(max_length=200)



    def save(self, *args, **kwargs):
        self.slug = slugify(self.name, instance=self)
        super(Clinic, self).save(*args, **kwargs)

编辑:

如果你的 url 像@Norman8054 所说的那样定义:

url(r'^clinic/(?P<slug>\w+)/$', views.clinicProfile, name='clinicProfile'),

您可以在视图中获取对象:

from django.shortcuts import get_object_or_404

def clinicProfile(request, slug):
    clinic = Clinic.objects.get(slug=slug)

这些是基本步骤。如果要确保 slug 字段是 unic,则需要在 save 方法中添加一些验证,或者使用模型的另一个字段进行 slugify。如果您认为 slug 字段可能会发生变化,您可能还需要将对象的 id 添加到 url 中。但这些都是基于用例的决策。

【讨论】:

谢谢@cor。这仅适用于我添加的新诊所。现有的诊所呢?我怎样才能让现有的诊所有一个蛞蝓作为诊所名称? 我不知道最好的方法。我会从shell手动完成。进行更改并迁移 de db 后,例如:clinics = Clinic.objects.all() 然后for clinic in clinics: clinic.slug = slugify(clinic.name,instance=clinic) 实际上比这更容易。 clinics = Clinic.objects.all(),然后是 for clinic in clinics: clinic.save()。还要记住,诊所的名称必须是唯一的。您不能将相同的网址映射到两个不同的诊所。 谢谢@cor。您能否详细说明如何通过视图中的 slug 获取对象。我对 django 很陌生【参考方案2】:

只是为了扩展 cor 的答案:在您的 urls.py 中使用 named group:

url(r'^clinic/(?P<slug>\w+)/$', views.clinicProfile, name='clinicProfile'),

【讨论】:

以上是关于django 1.6:创建 slug url的主要内容,如果未能解决你的问题,请参考以下文章

Django 自动创建 slug 和完整性错误

如何让 Django 从 unicode 字符创建 slug?

请问如何在我的 url.py django 3 中使用 slug 创建 url?

在 Django 中生成唯一的 slug

django 1.9 slug 字段不适用于外语

Django UserProfile slug 字段