2010-12-22 33 views
3

如何访问django中的扩展的flatpage中的字段?
我写了这个:在django中访问扩展的flatpage中的字段

class ExtendedFlatPage(FlatPage): 
    teaser = CharField(max_length=150) 

class ExtendedFlatPageForm(FlatpageForm): 
    teaser = CharField(max_length=150) 
    class Meta: 
     model = ExtendedFlatPage 

class ExtendedFlatPageAdmin(FlatPageAdmin): 
    form = ExtendedFlatPageForm 
    fieldsets = (
     (None, {'fields': ('url', 'title', 'teaser', 'content', 'sites',)}), 
    )  

admin.site.unregister(FlatPage) 
admin.site.register(ExtendedFlatPage, ExtendedFlatPageAdmin) 

与创作管理员就可以了。但后来在flatpages/default.html我试过这个:

<html> 
<body> 
<h1>{{ flatpage.title }}</h1> 
<strong>{{ flatpage.teaser }}</strong> 
<p>{{ flatpage.content }}</p> 
</body> 
</html> 

而且没有flatpage.teaser!哪里不对?

+1

我认为FlatpageFallbackMiddleware仍然会使用默认的Flatpage模型。此外,您的方法将使用[多表继承](http://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance),这意味着您有两个为扩展模型创建的表使您的查询效率降低。 – 2010-12-22 09:56:20

+0

是的,我看到了第二个表和正确的值。问题是我如何访问flatpage模板中的新字段? – Stan 2010-12-22 09:58:30

回答

0

确定您将正确的对象传递给模板,而不是普通的FlatPage?此外,除非您的代码粘贴来自不同的文件,并且您未显示导入,否则您的模型应该包含来自django.models的字段以及来自django.forms的表单。你没有在你的小模板中显示表单,所以我不认为这是问题......但是如果你的模型'teaser'来自django.forms.CharField而不是django.models.CharField,那么......你可能不会看到它。但是你在管理员中说好吗?

你确定它的渲染模板,而不是一个类似的吗? (你至少应该有一个空的<blockquote>对)。

从Django的壳试试,让你的对象(富= ExtendedFlatPage.objects.get(ID = 1)或类似),并做就可以foo.teaser ...

4

是的,因为画谜提到FlatpageFallbackMiddleware将默认的FlatPage模型实例传递给模板。但在你的情况下,模板变量{{ flatpage }}也会记住它是否为ExtendedFlatPage实例,如django-docs中所述。

所以对待你的简单页面的ExtendedFlatPage你必须使用:

{{ flatpage.extendedflatpage.teaser }},而不是{{ flatpage.teaser }}