Доступ к полю в расширенной плоской странице в Django - PullRequest
3 голосов
/ 22 декабря 2010

Как получить доступ к полю в расширенной плоской странице в 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!Что не так?

Ответы [ 2 ]

4 голосов
/ 19 февраля 2011

Да, как упомянул ребус, FlatpageFallbackMiddleware передаст экземпляр модели FlatPage по умолчанию в шаблон.Но в вашем случае переменная шаблона {{ flatpage }} также запомнит, является ли она ExtendedFlatPage экземпляром, как описано здесь в django-docs .

Таким образом, для обработки вашей плоской страницы как ExtendedFlatPage у вас естьиспользовать:

{{ flatpage.extendedflatpage.teaser }} вместо {{ flatpage.teaser }}.

0 голосов
/ 22 декабря 2010

Уверен, что вы передаете нужный шаблон в шаблон, а не просто FlatPage?

Кроме того, если код вставки кода не из разных файлов и вы не показывали импорт, ваша модель должна иметь поляот django.models и вашей формы от django.forms.Вы не показываете форму в своем маленьком шаблоне, так что я не думаю, что это проблема ... Но если ваша модель 'тизер' идет от django.forms.CharField вместо django.models.CharField, тогда ... выскорее всего не увидит.Но вы говорите, что все в порядке в Admin?

Вы уверены, что он отображает этот шаблон, а не похожий?(У вас должна быть хотя бы пустая пара

).

Попробуйте из оболочки django получить свой объект (foo = ExtendedFlatPage.objects.get (id = 1) или аналогичный) и выполните foo.Тизер на нем ...

...