我正在django中创建一个简单的CMS,包含多个“模块”(每个模块都是django应用程序)。我建立了以下模型:
class FooObject(models.Model):
id = models.SlugField(primary_key=True)
name = models.CharField(max_length=255)
creator = models.ForeignKey(auth.models.User, editable=False, related_name="createdby")
class FooPage(FooObject):
content = models.TextField(blank=True, null=True)
@models.permalink
def get_absolute_url(self):
return ('page', (), {'page_id':self.id}
class FooSubitem(FooObject):
parent = models.ForeignKey(FooPage, related_name='subitems')在每个模块中,我创建了FooPage的一个子类,以及至少一个FooSubitem的子类。
# in FooBlog.models
class FooBlog(FooPage):
owner = models.ForeignKey(auth.models.User, editable=False)
@models.permalink
def get_absolute_url(self):
return ('blog', (), {'blog_id':self.id})
class FooPost(FooSubitem):
post_time = models.DateTimeField(auto_now_add=True)和
# in FooGallery.models
class FooGallery(FooPage):
location = models.CharField(max_length=255)
@models.permalink
def get_absolute_url(self):
return ('gallery', (), {'gallery_id':self.id})
class FooImage(FooSubitem):
image_file = models.ImageField(upload_to='foogallery')这些都是简化的,但应该让你对我想做的事情有一个好的认识。在FooPost和FooImage的管理员中,我将父选择列表限制在相应的父页面上。
当我试图在模板中使用这些内容时,我的问题就出现了。在每一种观点中,我有以下几点:
page_list = FooPage.objects.all()它返回所有FooPages ( FooBlog和FooGallery类型)的列表。但是,当我遍历这个列表时:
{% for page in page_list %}{{ page.get_absolute_url }}{% endfor %}它返回‘页面’url模式,而不是‘博客’或‘图库’url模式。
当我以后要添加一个FooCalendar模块时,我如何使这个工作不需要重写代码呢?我想确保这与任何可能的模块一起工作。
谢谢,
发布于 2010-07-06 05:52:07
这个问题的经典解决方案往往是向超类添加一个ContentType,该类存储该实例的子类类型。。通过这种方式,您可以依赖于一个一致的API,该API返回相应类型的相关子类对象。
发布于 2013-01-10 22:16:38
通过使用来自InheritanceManager的django-模型-utils,可以避免添加内容类型字段。
然后,如果您在查询集上调用.select_subclasses,它将关闭所有对象,例如:
FooPage.objects.select_subclasses().all()发布于 2010-07-05 05:05:48
FooPage.objects.all()返回FooPage类型的所有对象,这些对象将混合用于FooPage、FooBlog、FooGallery的基础db表行。要获得正确的URL,您应该得到FooBlog或FooGallery对象。
page.fooblog.get_absolute_url()如果页面只是通过FooPage创建的页面对象,那么它可能会引发FooPage错误,因此,为了获得正确的urls,您可以这样做
urls = []
for page in FooPage.objects.all():
try:
page = page.fooblog
except FooBlog.DoesNotExist:
pass
urls.append(page.get_absolute_url())或者,如果不希望FooPage成为真正的表,则可以尝试将FooPage设置为抽象类。
https://stackoverflow.com/questions/3176731
复制相似问题