簡體   English   中英

Django-結合DetailView和ListView

[英]Django - combine DetailView and ListView

我是Django的新手,我想構建一個Web應用程序,向您顯示事件列表。 您可以有幾個不同的列表(例如體育賽事,生日...)。 我制作了兩個模型-日歷(事件列表)和事件。

在我的頁面上,我有導航菜單,您可以在其中看到“日歷”列表。 當您單擊一個日歷時,您可以看到該日歷的事件列表,但我也想在側欄中保留一個日歷列表。

據我了解,Django我需要兩個視圖-ListView(用於邊欄日歷)和DetailView(用於每個日歷中的事件)。

這是我的看法:

class DetailView(generic.DetailView):
    model = Calendar
    template_name = 'koledarji/detail.html'

class CalendarsView(generic.ListView):
    template_name = 'koledarji/calendars.html'
    context_object_name = 'calendars_list'
    def get_queryset(self):
        return Calendar.objects.all()

通過這種方法,我可以在每個特定日歷上使用詳細信息,但是我在側邊欄導航菜單上丟失了日歷列表。

我的特定日歷網址:

url(r'^(?P<pk>[0-9]+)$', views.DetailView.as_view(), name='detail'),

和我的模板的一部分:

{% extends 'prijavljen/calendar.html' %}

{% block cal_name %}

    {% for calendar in calendars_list %}
        {% if request.path == '/prijavljen/'|add:calendar.id %}
            {{calendar.name }}
        {% endif %}
    {% endfor %}
{% endblock %}

在該代碼之后,我想列出一個事件列表,但是例如,即使日歷名稱也應足以解決。

我試圖通過將request.path與我想要的路徑od日歷進行比較來解決此問題,但也無法正常工作。

任何幫助,將不勝感激。

您可以修改DetailView類並添加get_context_data()方法。 這將使您能夠將額外的上下文(在本例中為Calendars.objects.all()注入到詳細信息視圖中。

class MyDetailView(generic.DetailView):
    model = Calendar
    template_name = 'koledarji/detail.html'
    def get_context_data(self, *args, **kwargs):
        context = super(MyDetailView, self).get_context_data(*args, **kwargs)
        context['calendars_list'] = Calendar.objects.all()
        return context

最好使用ListView,因為您可能仍想使用分頁。 像這樣:

class DetailListView(ListView):
    detail_context_object_name = 'object'

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super(DetailListView, self).get(request, *args, **kwargs)

    def get_queryset_for_object(self):
        raise NotImplementedError('You need to provide the queryset for the object')

    def get_object(self):
        queryset = self.get_queryset_for_object()
        pk = self.kwargs.get('pk')
        if pk is None:
            raise AttributeError('pk expected in url')
        return get_object_or_404(queryset, pk=pk)

    def get_context_data(self, **kwargs):
        context = super(DetailListView, self).get_context_data(**kwargs)
        context[self.detail_context_object_name] = self.object
        return context

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM