3

フラットページに変換できる複数のモデルがありますが、いくつかの追加情報が必要です(たとえば、私たちについてのページがありますが、ブログもあります)。
ただし、ミドルウェアはフラットページインスタンスのみを返し、子モデルを解決しないため、フラットページモデルは1つだけでなければならないことを理解しています。
私は何をしなければなりませんか?

編集:
ビューを変更する必要があるようです。
現在のコードは次のとおりです。

from django.contrib.flatpages.models import FlatPage
from django.template import loader, RequestContext
from django.shortcuts import get_object_or_404
from django.http import HttpResponse, HttpResponseRedirect
from django.conf import settings
from django.core.xheaders import populate_xheaders
from django.utils.safestring import mark_safe
from django.views.decorators.csrf import csrf_protect

DEFAULT_TEMPLATE = 'flatpages/default.html'

# This view is called from FlatpageFallbackMiddleware.process_response
# when a 404 is raised, which often means CsrfViewMiddleware.process_view
# has not been called even if CsrfViewMiddleware is installed. So we need
# to use @csrf_protect, in case the template needs {% csrf_token %}.
# However, we can't just wrap this view; if no matching flatpage exists,
# or a redirect is required for authentication, the 404 needs to be returned
# without any CSRF checks. Therefore, we only
# CSRF protect the internal implementation.
def flatpage(request, url):
    """
    Public interface to the flat page view.

    Models: `flatpages.flatpages`
    Templates: Uses the template defined by the ``template_name`` field,
        or `flatpages/default.html` if template_name is not defined.
    Context:
        flatpage
            `flatpages.flatpages` object
    """
    if not url.endswith('/') and settings.APPEND_SLASH:
        return HttpResponseRedirect("%s/" % request.path)
    if not url.startswith('/'):
        url = "/" + url

    # Here instead of getting the flat page it needs to find if it has a page with a child model.
    f = get_object_or_404(FlatPage, url__exact=url, sites__id__exact=settings.SITE_ID)
    return render_flatpage(request, f)

@csrf_protect
def render_flatpage(request, f):
    """
    Internal interface to the flat page view.
    """
    # If registration is required for accessing this page, and the user isn't
    # logged in, redirect to the login page.
    if f.registration_required and not request.user.is_authenticated():
        from django.contrib.auth.views import redirect_to_login
        return redirect_to_login(request.path)
    if f.template_name:
        t = loader.select_template((f.template_name, DEFAULT_TEMPLATE))
    else:
        t = loader.get_template(DEFAULT_TEMPLATE)

    # To avoid having to always use the "|safe" filter in flatpage templates,
    # mark the title and content as already safe (since they are raw HTML
    # content in the first place).
    f.title = mark_safe(f.title)
    f.content = mark_safe(f.content)

    # Here I need to be able to configure what I am passing in the context
    c = RequestContext(request, {
        'flatpage': f,
    })
    response = HttpResponse(t.render(c))
    populate_xheaders(request, response, FlatPage, f.id)
    return response
4

1 に答える 1

1

あなたはこれについて間違っている。ビューを変更する必要はまったくありません。contrib Flatpagesアプリは、「フラットページ」、つまりAboutページのようなページという特定の目的のために構築されているので、そのために使用します。ブログの場合、(現在または将来のいずれかで)大幅に異なる機能を使用することになります。そのため、別のアプリを使用してください。すでにいくつかの「ブログ」アプリがあるか、独自の簡単なアプリを作成してください。

あなたの質問から、あなたはFlatpagesを継承するいくつかのモデルを書いたようです。これは大丈夫だと思いますが、そもそもこのような小さなモデルにはちょっとばかげているようです。その場合、あなたがする必要があるのは、Flatpageアプリがそれらについて何も知らないことを期待せずに、それらのモデルを使用する独自のビューを独自のアプリで作成することです。お役に立てば幸いです。

于 2010-12-29T19:12:30.847 に答える