2017-06-01 86 views
0

我想让django在该类别的页面上显示来自单个图层的帖子,而是显示模板中每个类别下的所有类别和帖子。Django循环返回多个帖子

这里是我的模型(我修剪下来):

class Category(models.Model): 
    ... 
    title = models.CharField(max_length=255, verbose_name="Title", null=True, blank=True) 
    slug = models.SlugField(max_length=200, unique=True) 


class Petition(models.Model): 
    ... 
    category = models.ManyToManyField(Category, verbose_name="Category", related_name='petitions') 
    ... 

views.py

class CategoryMixin(object): 
    def get_context_data(self, **kwargs): 
     context = super(CategoryMixin, self).get_context_data(**kwargs) 
     context['categories'] = Category.objects.all() 
     return context 


class CategoryView(CategoryMixin, generic.ListView): 
    model = Category 
    categories = Category.objects.all() # this will get all categories, you can do some filtering if you need (e.g. excluding categories without posts in it) 
    queryset = Category.objects.all() 
    template_name = 'petition/category_list.html' 


class CategoryIndexView(generic.ListView): 
    model = Category 
    template_name = 'petition/category.html' 
    context_object_name = 'category_list' 

    def get_queryset(self): 
     return Category.objects.prefetch_related('petitions').order_by('-created_on')[:10] 



class PetitionIndexView(generic.ListView): 
    template_name = 'petition/home.html' 
    context_object_name = 'petition_list' 
    queryset = Petition.objects.order_by('-created_on') 

    def get_queryset(self): 
     queryset_list = Petition.objects.order_by('-created_on') 

     #SEARCH QUERY LOGIC 
     query = self.request.GET.get("q") 
     if query: 
      queryset_list = queryset_list.filter(
       Q(title__icontains = query) | 
       Q(petition__icontains = query) | 
       Q(created_by__first_name__icontains = query) | #icontains = only text fields. Use text field within foreign key field 
       Q(created_by__last_name__icontains = query) 
       ).distinct() 

     paginator = Paginator(queryset_list, 10) # Show 10 posts per page 
     page = self.request.GET.get('page') 

     try: 
      queryset = paginator.page(page) 
     except PageNotAnInteger: 
      # If page is not an integer, deliver first page. 
      queryset = paginator.page(1) 
     except EmptyPage: 
      # If page is out of range (e.g. 9999), deliver last page of results. 
      queryset = paginator.page(paginator.num_pages) 

     return queryset 

     context = { 
     'object_list' : queryset, 
     'title' : 'List' 
     } 

urls.py

url(r'^$',views.PetitionIndexView.as_view(), name="homepage"), 
url(r'^petition/(?P<slug>[\w-]+)/$',views.DetailView.as_view(), name="detail"), 
url(r'^categories/$', views.CategoryView.as_view(), name='category_list'), 
url(r'^category/(?P<slug>[\w-]+)/$',views.CategoryIndexView.as_view(), name="category_detail"), 

我的模板(category.html为CategoryIndexView )是这种格式,

category.html

{% for category in category_list %} 
    {% for petition in category.petitions.all %} 
     ... 
     {{ petition.title }} 
     ... 
    {% end for %} 
{% end for %} 

这表明在相同的模板在A类,B和C的职位。

有了我设置的视图,我怎样才能让它在类别A被点击时只显示类别A的帖子?

此外,订购无法正常工作。这是不遵守我给它在视图中的排序

+0

模板中的django循环是否在每次更改类别时执行?我猜是这样,在这种情况下,类别列表变量是否根据您刚切换到的类别而改变? – Strinnityk

+0

请显示您的网址。 –

+0

@DanielRoseman我已经添加了网址 –

回答

0

我猜,每次更改类别时,整个循环再次执行,而不改变category_list内容(最初是[“A”,“ B“,”C“])。在这种情况下,即使您单击按钮以更改类别,无论如何,循环都会再次显示类别“A”,“B”和“C”的内容。

您是否尝试添加if语句来检查您目前在哪个类别中,并只显示该类别中的帖子?

{% for category in category_list %} 
    {% if category.name == ACTUAL_CATEGORY_TO_DISPLAY %} 
    {% for petition in category.petitions.all %} 
     ... 
     {{ petition.title }} 
     ... 
    {% end for %} 
    {% end if %} 
{% end for %} 

编辑:

由于@Daniel罗斯曼在评论中指出,这是一个非常低效的解决方案。我刚刚发布了它,因为我猜测这是否真的发生在你身上。

如果是这种情况,你不应该这样做。正确的解决方案之一是提出一个新请求,每次更改时都会检索该给定类别的所有帖子。

无论如何,我只是在这里猜测。为了给我们更好的洞察力,你应该发布改变类别的模板代码。

+0

虽然这会起作用,但这是解决问题的非常低效的解决方案。为什么要首先循环你不想要的类别?过滤应该在视图中完成。 –

+0

@DanielRoseman我意识到这一点,它只是它想到的最快的解决方案,却不知道类别更改是如何完成的。 – Strinnityk

1

您正在使用错误的视图类。 ListView将显示类的实例列表;因此CategoryIndexView将显示类别列表。但你不想要一个类别列表;你想要一个单一的类别,以及它的请愿清单。所以,你应该使用DetailView。

class CategoryDetailView(generic.DetailView): 
    model = Category 
    template_name = 'petition/category.html' 
    context_object_name = 'category' 

    def get_queryset(self): 
     return Category.objects.prefetch_related('petitions') 

而模板仅仅是:

{% for petition in category.petitions.all %} 
    ... 
    {{ petition.title }} 
    ... 
{% end for %} 

编辑:我是从“category_list”到“类”和现在的模板返回正确的岗位换了context_object_name。

+0

它现在像一种魅力。我的错误是复制'ListViews'。感谢您的帮助。 –