2017-06-01 9 views
0

私はdjangoにそのカテゴリのページの1つのcatgoryからの投稿を表示させようとしていますが、テンプレートの各カテゴリのすべてのカテゴリと投稿を表示します。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:CategoryIndexViewため

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ここ

は私のモデル(私はそれらをトリミング)されています)は、この形式です。

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

URLを表示してください。 –

+0

@DanielRoseman URLを追加しました –

答えて

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ローズマンはコメントで指摘したように、これは非常に非効率的なソリューションです。私はちょうどそれがあなたに起こっているかどうか推測しているので、それを投稿しました。

これが該当する場合は、これを行うべきではありません。適切なソリューションの1つは、変更するたびにそのカテゴリのすべての投稿を取得する新しいリクエストを作成することです。

私はちょうどここで推測しています。私たちがあなたにもっと良い洞察を与えるためには、カテゴリ変更を行うテンプレートコードを投稿するべきです。

+0

これはうまくいくが、問題に対する非常に非効率的な解決策である。最初に欲しくないカテゴリをループするのはなぜですか?フィルタリングはビューで実行する必要があります。 –

+0

@DanielRoseman私はこれを認識しています。カテゴリの変更がどのように行われているかを知らなくても、もっとも早い解決策に過ぎません。 – Strinnityk

1

不適切な表示クラスを使用しています。 ListViewは、クラスのインスタンスのリストを表示します。 CategoryIndexViewはカテゴリのリストを表示することになります。しかし、あなたはカテゴリーのリストを望んでいません。 1つのカテゴリーとその申請のリストが必要です。したがって、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'を複製することでした。助けてくれてありがとう。 –

関連する問題