Django - 结合DetailView和ListView

5
我是新手Django开发者,我想创建一个Web应用程序,可以显示您的事件列表。您可以有几个不同的列表(例如体育赛事、生日等)。我已经创建了两个模型 - 日历(事件列表)和事件。
在我的页面上,我有导航菜单,您可以看到“日历”列表。当您单击一个日历时,您可以查看该日历的事件列表,但是我也想在侧边栏保留日历列表。
据我理解,我需要两个视图来实现这一点 - 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:

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 %}

在那段代码之后,我想要列出一些事件,但是例如日历的名称就足以解决问题。

我曾尝试通过比较请求路径和所需日历的路径来解决该问题,但并没有成功。

任何帮助都将不胜感激。

2个回答

10
您可以修改 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

谢谢!是否有办法使用CreateView完成同样的事情?我想要将事件添加到日历中:class EventCreate(CreateView): model = Event fields = ['name', 'description'] success_url = '/prijavljen/' ... def get_context_data(self, *args, **kwargs): context = super(EventCreate, self).get_context_data(*args, **kwargs) context['calendars_list'] = Calendar.objects.all() context['calendar'] = ?????? return context - francosy

8
最好使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接