【问题标题】:Django - combine DetailView and ListViewDjango - 结合 DetailView 和 ListView
【发布时间】:2017-05-08 07:58:26
【问题描述】:

我是 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 日历进行比较来解决这个问题,但也不起作用。

任何帮助将不胜感激。

【问题讨论】:

    标签: python django django-views


    【解决方案1】:

    您可以修改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
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-05-31
      • 2020-03-06
      • 1970-01-01
      • 2013-05-19
      • 2014-01-14
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      相关资源
      最近更新 更多