Django URL配置
假设我有三个模型:城市(City)、区域(Area)和条目(Entry)。
每个城市都有几个区域,而每个区域可以有多个条目。但是目前来说,每个区域只会有一个活跃的条目,并且这个条目会被显示出来。所以从逻辑上讲:
需要注意的是,每个城市、区域和条目都会使用相关模型类的slug变量。
格式如下:
www.mysite.com/<slug of city>/<slug of area>/<slug of entry>
www.mysite.com/mycity/myarea/
-> 这个链接会显示与该区域相关联的活跃条目(可以通过区域的active_entry
函数来判断)。
不过用户也可以查看一些旧的条目,比如:
www.mysite.com/mycity/myarea/some-old-entry-that-is-no-longer-active
我已经根据《实用Django项目 第2版》这本书写了get_absolute_url函数,但现在遇到了瓶颈。
我有这样的模型:
from django.db import models
class Entry(models.Model):
area = models.ForeignKey('Area',verbose_name="The area that this entry belongs to")
slug = slug = models.SlugField(unique=True) # this will be auto populated via admin panel, from title
title = baslik = models.CharField()
content = models.TextField()
start_time = models.DateTimeField()#start time for this entry.
end_time = models.DateTimeField()#end time for this entry.
@models.permalink
def get_absolute_url(self):
return ("entry.detail",(),{"city":self.area.city.slug,"area":self.area.slug,"entry":self.slug})
class Area(models.Model):
city = models.ForeignKey(verbose_name="city that this area belongs to")
name = models.CharField(max_length=30)
slug = models.SlugField(unique=True)# this will be auto populated via admin panel, from name
@models.permalink
def get_absolute_url(self):
return ("bolge.detay",(),{"city":self.city.slug,"area":self.slug})
def active_entry(self):
from datetime import datetime, date, time
now = datetime.now()
try:
return Entry.objects.get(area__exact=self,start_time__lte=now,end_time__gte=now)
except Entry.DoesNotExist:
return False
class City(models.Model):
name =models.CharField(max_length=30)
slug = models.SlugField(unique=True) # this will be auto populated via admin panel, from name
@models.permalink
def get_absolute_url(self):
return ("city.detail",(),{"city":self.slug})
请帮助这个可怜的家伙配置他的URL设置。
谢谢
1 个回答
1
它可能看起来像这样:
urlpatterns = patterns('',
(r'^(?P<city>[a-z-]+)/(?P<area>[a-z-]+)/$', 'yourapp.views.areaview'),
(r'^(?P<city>[a-z-]+)/(?P<area>[a-z-]+)/(?P<entry>[a-z-]+)/$', 'yourapp.views.entryview'),
)