2017-06-01 60 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'。感謝您的幫助。 –