Django-结合DetailView和ListView

fra*_*osy 4 python django django-views

我是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()
Run Code Online (Sandbox Code Playgroud)

通过这种方法,我可以在每个特定的日历上使用详细信息,但是我在侧边栏导航菜单上丢失了日历列表。

我的特定日历网址:

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

和我的模板的一部分:

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

{% block cal_name %}

    {% for calendar in calendars_list %}
        {% if request.path == '/prijavljen/'|add:calendar.id %}
            {{calendar.name }}
        {% endif %}
    {% endfor %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

在该代码之后,我想列出一个事件列表,但是例如,即使日历名称也足以解决。

我试图通过将request.path与我想要的路径od日历进行比较来解决此问题,但也无法正常工作。

任何帮助,将不胜感激。

Joh*_*han 7

使用 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
Run Code Online (Sandbox Code Playgroud)


Geo*_*fin 5

您可以修改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
Run Code Online (Sandbox Code Playgroud)