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 从 unicode 字符创建 slug?