6

如何访问 django 扩展平面页面中的字段?
我写了这个:

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!怎么了?

4

2 回答 2

6

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

ExtendedFlatPage因此,要按照您必须使用的方式对待您的平面页面:

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

于 2011-02-19T13:00:56.667 回答
0

确定您将正确的对象传递给模板,而不是普通的 FlatPage?

此外,除非您的代码粘贴来自不同的文件并且您没有显示您的导入,否则您的模型应该具有来自 django.models 的字段和来自 django.forms 的表单。你没有在你的小模板中显示表单,所以我认为这不是问题......但是如果你的模型“预告片”来自 django.forms.CharField 而不是 django.models.CharField 那么......你可能不会看到它。但你说它可以在管理员?

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

从 django shell 中尝试,获取您的对象(foo = ExtendedFlatPage.objects.get(id=1) 或类似的)并对其执行 foo.teaser...

于 2010-12-22T09:51:11.777 回答