Allhambra
Allhambra

Reputation: 1

How to render view from differents applications in the same template?

I have two applications (blog and category). On the post list template I would like to get the category blog name and description.

I have tried to put the import category model in the blog view, but nothing show up. So I have made two views rendering the same template, but it does not work.

Blog models:

from django.db import models
from django.utils import timezone
from autoslug import AutoSlugField
from category.models import Category


class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    category = models.ForeignKey(Category, on_delete=models.CASCADE,
    default = '')
    title = models.CharField(max_length=200)
    ...

class Meta:
    verbose_name = "Post"
    verbose_name_plural = "Posts"
    ordering = ['created_date']


def publish(self):
    self.published_date = timezone.now()
    self.save()

def __str__(self):
    return self.title

category models:

class Category(models.Model):
name = models.CharField(max_length=200)
slug = AutoSlugField(populate_from='name', default='')
parent = models.ForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE)
description = models.TextField(max_length=200)

class Meta:
    unique_together = ('slug', 'parent',)    # Enforcing that there can not be two
    verbose_name_plural = "categories"       # categories under a parent with same
                                             # slug

def __str__(self):                           # __str__ method elaborated later in
    full_path = [self.name]                  # post.  use __unicode__ in place of
                                             # __str__ if you are using python 2
    k = self.parent

    while k is not None:
        full_path.append(k.name)
        k = k.parent

    return ' -> '.join(full_path[::-1])

Blog view:

def post_list(request):
posts = Post.objects.all()
cat_blog = Category.objects.get(pk=1)
context = {
    'posts': posts,
    'cat_blog': cat_blog
}
return render(request, 'blog/post_list.html', context)

Category view:

def cat_blog(request):
   cat_blog = Category.objects.get(pk=1)
   return render(request, 'blog/post_list.html', {'cat_blog': cat_blog})

post_list.html:

<div class="section-header text-center">
    {% for category in cat_blog %}
        <h1>{{ category.name }}</h1>
        <p class="tag">{{ category.description }}</p>
    {% endfor %}
</div>
<div class="row py-5">

{% for post in posts %}
    // This part is fine
{% endfor%}

The post loop is fine. How can't I get the category name and description in my section header?

Upvotes: 0

Views: 50

Answers (1)

Freedom Frog
Freedom Frog

Reputation: 88

One URL gives one View gives one template.

You use the View to give context to the template to render.

def post_list(request):
    posts = Post.objects.all()
    cat_blog = Category.objects.get(pk=1)
    context = {
        'posts': posts,
        'cat_blog': cat_blog
    }
    return render(request, 'blog/post_list.html', context)

Your url.py file should point to the post_list view.

Upvotes: 1

Related Questions