【问题标题】:How do I convert a view method to a Generic List View?如何将视图方法转换为通用列表视图?
【发布时间】:2017-09-08 15:09:40
【问题描述】:

我在查看页面上有这个方法。它工作正常并正确显示所有内容,但我想将其转换为通用列表视图,以便我可以对其应用分页。

这里是函数:`

#views.py
def index(request):
    all_artists = Artist.objects.all()
    all_songs = Song.objects.all()
    all_albums = Album.objects.all()

    return render(request, 'index.html', {'all_albums':all_albums,'all_songs':all_songs, 'all_artists':all_artists})

所以我遵循了一些教程并最终得到了这个:

#new views.py
class IndexView(ListView):
    template_name = 'index.html'
    context_object_name = 'home_list'
    queryset = Artist.objects.all()

    def get_context_data(self, **kwargs):
        context = super(IndexView, self).get_context_data(**kwargs)
        context['all_artists']=Artist.objects.all()
        context['all_songs']=Song.objects.all()
        context['all_albums']=Album.objects.all()

虽然它编译没有任何错误,但当我渲染页面时,上下文对象不会被渲染。 非常感激你的帮助! 谢谢你

编辑(17 年 4 月 13 日): 谢谢你们!经过一些小的修改,它终于可以工作了。

class IndexView(generic.ListView):
    template_name = 'index.html'
    context_object_name = 'home_list'
    queryset = Artist.objects.all()

    def get_context_data(self, **kwargs):
        context = super(IndexView, self).get_context_data(**kwargs)
        context['all_artists']=Artist.objects.all()
        context['all_songs']=Song.objects.all()
        context['all_albums']=Album.objects.all()  
        return context
    enter code here
    enter code here

【问题讨论】:

  • 没有必要为了使用分页而转换为通用视图;您当然可以在基于函数的视图中使用分页。但是什么,你到底在分页吗?您在那里有三个单独的查询集。

标签: python django listview generics detailview


【解决方案1】:

urls.py 在您的 django 应用程序的 urls.py 中,您需要包含一个引用您的视图的 url,并将此 urls.py 包含到您的 django 项目主 urls.py 中。

#urls.py
from django.conf.urls import url
from .views import IndexView

urlpatterns = [
url(r'^path/$', IndexView.as_view(), name="index"),
]

然后在你的views.py中覆盖变量paginate_by

#views.py
class IndexView(ListView):
    template_name = 'index.html'
    context_object_name = 'home_list'
    queryset = Artist.objects.all()
    paginate_by = 10 # Number of objects for each page

    def get_context_data(self, **kwargs):
        context = super(IndexView, self).get_context_data(**kwargs)
        context['all_artists']=Artist.objects.all()
        context['all_songs']=Song.objects.all()
        context['all_albums']=Album.objects.all()  
        return context

终于在你的 index.html 中 添加分页 {% pagination_for page_obj %}

{% block content %}

<!--some content -->

<!--begin paginator -->
{% pagination_for page_obj %}
<!--end paginator-->

{% endblock %}

【讨论】:

    【解决方案2】:

    您的 get_context_data() 需要返回上下文。因此,如果这是您的确切代码,则需要向其添加 return context

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多