在 django 中访问扩展平面中的字段

Sta*_*tan 5 python django django-flatpages

如何在 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)
Run Code Online (Sandbox Code Playgroud)

在 admin 中创建是可以的。但后来在 flatpages/default.html 我试过这个:

<html>
<body>
<h1>{{ flatpage.title }}</h1>
<strong>{{ flatpage.teaser }}</strong>
<p>{{ flatpage.content }}</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

而且没有 flatpage.teaser!怎么了?

Dze*_*kob 5

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

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

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


Spa*_*man 0

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

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

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

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