0

広告とバナーの 2 つのモデルがあります。

「汎用ビュー」を使用する場合、どのように同時にまとめることができますか以下のコードは1つだけをもたらします

urlpatterns = patterns('',


    url(r'^(?P<pk>\d+)/$', DetailView.as_view(
        model               = Advertisment,
        context_object_name = 'advertisment',
    ), name='cars-advertisment-detail'),

    url(r'^$', SearchView.as_view(), name='cars-advertisment-search'),
)
4

2 に答える 2

1

get_context_data()クラスベースのビューのメソッドをオーバーライドする必要があります( docsで説明されているように)。

from django.views.generic import DetailView

class YourDetailView(DetailView):

    model = Advertisment
    context_object_name = 'advertisment'

    def get_context_data(self, *args, **kwargs):
        context = super(YourDetailView, self).get_context_data(*args, **kwargs)
        if 'banner_id' in self.kwargs:
            context['banner'] = get_object_or_404(Banner, pk=self.kwargs['banner_id']
        return context

URL conf を更新して、Banner モデルの主キーも含める必要があると思います。

from your_app.views import YourDetailView

  url(r'^(?P<ad_pk>\d+)/(?P<banner_pk>\d+)/$', YourDetailView.as_view(), name='cars-advertisment-detail'),
于 2013-02-09T07:20:02.333 に答える
1

エイダンの答えは、単一のビューに対してのみ実行したい場合に適していますが、各ページにバナーを自動的に表示したい場合は、主に 2 つのオプションがあります。

1 つは、バナーをレンダリングするテンプレート タグを作成し、このタグをバナーを表示するテンプレートに追加することです。

タグは次のようになります。

@register.inclusion_tag('banner.html')
def banner_display():
    random_banner = Banner.objects.order_by('?')[0]
    return {'the_banner': random_banner}

次に、バナーを表示するテンプレートを作成します。

<a href="{{ the_banner.url }}"><img src="{{ the_banner.url|safe }}" /></a>

バナーが必要なテンプレートでは、次のように言うだけです。{% banner_display %}

もう 1 つのオプションは、カスタムテンプレート コンテキスト プロセッサを作成することです。これにより、バナーがすべてのリクエストに通常の変数として挿入されます。これはおそらくさらに簡単です。

def banner_display(request):
    random_banner = Banner.objects.order_by('?')[0]
    return {'the_banner': random_banner}

これをファイルに保存してから、設定に追加する必要がありますTEMPLATE_CONTEXT_PROCESSORS。これで、すべてのテンプレートに変数があります{{ the_banner }}

于 2013-02-09T07:59:00.207 に答える