2010-12-22 36 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 }}