David
David

Reputation: 221

multiple query model in same view django

I've been doing some django these past weeks and I'm having a problem.

I have a page where Articles are shown. No problem while reovering all articles from db. But now I'd like to get all categories (an Article has a category) that I have in my database.

So I can display like this in my page:

List of categories -cat1 -cat2 -cat3

List of articles -art1 -art2 -art3

But I don't know how to do with both queries.

Here's what I've tried.

class IndexView(generic.ListView):
    template_name = 'eduardoApp/index.html'
    context_object_name = 'article_list'

    def get_queryset(self):
        return Article.objects.order_by('article_name')

    def get_categories(request):
        category_list=Category.objects.all()
        context = {'category_list':category_list}
        return render(request,'eduardoApp/index.html',context)

And in my view:

<h2>List of categories</h2>
{% if category_list %}
    {% for category in category_list %}
        <p>{{ category.name }}</p>
    {% endfor %}
{% else %}
<p>no categorys</p>
{% endif %}

<h2>List of articles</h2>
{% if article_list %} 
    <div class="flex-container">
        {% for article in article_list %}
            <div><a href="{% url 'eduardoApp:detail' article.id %}">{{ article.article_name }}</a></div>
        {% endfor %}
    </div>
{% else %}
    <p>No articles...</p>
{% endif %}
{% endblock %}

In my view I keep seeing no categorys displayed (since category_list does not exist but don't know why and how to fix)

Upvotes: 0

Views: 113

Answers (1)

Andrey Nelubin
Andrey Nelubin

Reputation: 3294

ListView is creating context with 'objects' as queryset get_queryset returns. I suppose your custom method get_categories hasn't been used anywhere?

Best practice here is to override get_context_data method like...

class IndexView(generic.ListView):
    ...
    def get_context_data(self, **kwargs):
        context = super(IndexView, self).get_context_data(**kwargs)
        context['category_list'] = ...
        return context

Upvotes: 1

Related Questions