2017-03-30 5 views
2

Ich bin neu in Django. Ich habe eine Django-Anwendung, wo speichert Produkte kategorisiert durch "X" und "Y".Django Vorlage Filter Queryset

views.py

... 

class CartListView(ListView): 

template_name = 'checkout/list.html' 
context_object_name = 'product_list' 

def get_queryset(self): 
    return Product.objects.filter(category__slug='X') | Product.objects.filter(category__slug='Y') 

def get_context_data(self, **kwargs): 
    context = super(CartListView, self).get_context_data(**kwargs) 
    context['minicurso'] = get_object_or_404(Category, slug='X') 
    context['pacotes'] = get_object_or_404(Category, slug='Y') 
    return context 
... 

In meinem views.py filtere ich diese Artikel von Ihrer Slug Kategorie.

Das Problem ist, ich versuche, die Produkte in der Kategorie "X" auf der Seite und die Produkte in der Kategorie "Y" mit einem Text zwischen ihnen zu rendern. Wie kann ich das machen?

list.html

{% for category in product_list %} 
    {{ category.name }} 
{% endfor %} 

<p> 
    Any text 
</p> 

{% for category in product_list %} 
    {{ category.name }} 
{% endfor %} 

Antwort

2

Zunächst einmal sollten Sie IN Betreiber über | verwenden, wenn das gefilterte queryset bevölkern:

def get_queryset(self): 
    return Product.objects.filter(category__slug__in=["X", "Y"]) 
Zweitens

, können Sie nicht nach jedem Feld filtern queryset in der Vorlage, wenn Sie a custom template tag schreiben, die das tut. Es verhindert jedoch den Zweck der Trennung des Darstellungscodes von der Datenlogik. Das Filtern von Modellen ist eine Datenlogik und das Ausgeben von HTML ist eine Präsentation. So müssen Sie get_context_data und übergeben jedes queryset in den Kontext außer Kraft zu setzen:

def get_context_data(self, **kwargs): 
    context = super(CartListView, self).get_context_data(**kwargs) 

    context['minicurso'] = get_object_or_404(Category, slug='X') 
    context['pacotes'] = get_object_or_404(Category, slug='Y') 

    context["x_product_list"] = self.get_queryset().filter(category=context['minicurso']) 
    context["y_product_list"] = self.get_queryset().filter(category=context['pacotes']) 

    return context 

Dann können Sie sie in der Vorlage verwenden:

{% for category in x_product_list %} 
    {{ category.name }} 
{% endfor %} 

... 

{% for category in y_product_list %} 
    {{ category.name }} 
{% endfor %} 
+0

ich das Update nicht gesehen hatte. Es ist Arbeit, danke, hat viel geholfen. – Hagzel

Verwandte Themen