Как отобразить название и описание категории? - PullRequest
0 голосов
/ 27 сентября 2019

Как мне отобразить название категории и краткое описание из модели категории на странице category.html?Я спрашиваю об этом, потому что я не могу понять это, и я беру код из Интернета, поэтому немного неясно, как это работает.Таким образом, код прямо сейчас переносит вас на страницу типа example.com/cat-slug, а затем показывает все посты в этой категории, но как мне отобразить название текущей категории на этой странице (category.html) вместе с описанием категориислишком?

models.py:

class Category(models.Model):
    name = models.CharField(max_length=100)
    short_desc = models.CharField(max_length=160)
    slug = models.SlugField()
    parent = models.ForeignKey('self',blank=True, null=True ,related_name='children', on_delete=models.CASCADE)

    class Meta:
        unique_together = ('slug', 'parent',)
        verbose_name_plural = "categories"

    def __str__(self):
        full_path = [self.name]
        k = self.parent

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

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

class Post(models.Model):
    user =  models.CharField(max_length=50, default=1)
    title = models.CharField(max_length=120)
    short_desc = models.CharField(max_length=50)
    category = models.ForeignKey('Category', null=True, blank=True, on_delete=models.CASCADE)
    tags = TaggableManager()
    content = models.CharField(max_length=1000)
    publish = models.DateField(auto_now=False, auto_now_add=False,)
    slug = models.SlugField(unique=True)

    def __str__(self):
        return self.title

    def get_cat_list(self):
        k = self.category
        breadcrumb = ["dummy"]
        while k is not None:
            breadcrumb.append(k.slug)
            k = k.parent

        for i in range(len(breadcrumb)-1):
            breadcrumb[i] = '/'.join(breadcrumb[-1:i-1:-1])
        return breadcrumb[-1:0:-1]

views.py:

def show_category(request, hierarchy=None):
    category_slug = hierarchy.split('/')
    category_queryset = list(Category.objects.all())
    all_slugs = [ x.slug for x in category_queryset ]
    parent = None
    for slug in category_slug:
        if slug in all_slugs:
            parent = get_object_or_404(Category, slug=slug, parent=parent)
        else:
            post = get_object_or_404(Post, slug=slug)
            post_related = post.tags.similar_objects()
            comments = post.comments.filter(active=True)
            instance = get_object_or_404(Post, slug=slug)
            breadcrumbs_link = instance.get_cat_list()
            category_name = [' '.join(i.split('/')[-1].split('-')) for i in breadcrumbs_link]
            breadcrumbs = zip(breadcrumbs_link, category_name)

            if request.method == 'POST':
                comment_form = CommentForm(data=request.POST)
                if comment_form.is_valid():
                    new_comment = comment_form.save(commit=False)
                    new_comment.post = post
                    new_comment.save()
            else:
                comment_form = CommentForm()

            context = {
                'post': post,
                'post_related': post_related,
                'comments': comments,
                'comment_form': comment_form,
                'instance': instance,
                'breadcrumbs': breadcrumbs,
            }
            return render(request, "blog/post_detail.html", context)
    context = {
        'post_set': parent.post_set.all(),
        'sub_categories': parent.children.all(),
    }
    return render(request, "blog/categories.html", context)

category.html:

{% extends 'base.html' %}

{% block content %}

Viewing: {{ name }} Category
{{ short_desc }}

<div class="container">
    <div class="row">
    {% if post_set %}
    {% for post in post_set %}
        <div class="col-lg-8 col-md-10 mx-auto">
            <div class="post-preview">
                <a href="/blog/{{ post.slug }}">
                    <h2 class="post-title">
                        {{ post.title }}
                    </h2>
                    <h3 class="post-subtitle">
                        {{ post.short_desc }}
                    </h3>
                </a>

                <p class="post-meta">Posted by
                    <a href="#">{{ post.user }}</a> at {{ post.publish }} in {{ post.category }}
                    <br />
                    {% for tag in post.tags.all %}
                        <font class="trigger blue lighten-4" size="3rem">{{ tag.name }}</font>
                    {% endfor %}
                </p>
            </div>
            <hr>
        </div>
    {% endfor %}
    {% else %}
        <p>No post found in this category.</p>
    {% endif %}
    </div>
</div>

{% endblock %}

1 Ответ

0 голосов
/ 27 сентября 2019

Я думаю, что реализация parent не верна, потому что в каждой итерации цикла родитель будет обновляться.

for slug in category_slug:
    if slug in all_slugs:
        parent = get_object_or_404(Category, slug=slug, parent=parent)  # <-- with each iteration, value of parent will be updated.

Вместо этого вы можете определить родителя следующим образом:

parent = Category.objects.filter(slug__in=category_slug, parent=None).first()

context = {
        'category': parent,  # send the category explicitly through the context
        'post_set': parent.post_set.all(),
        'sub_categories': parent.children.all(),
    }

И обновить шаблон:

Viewing: {{ category.name }} Category
{{ category.short_desc }}
...