0

I have two options for my articles in my django website: "draft" and "published" I wrote sth that helps me show only the articles that are on "published" status in admin page. But the code doesn't work. when I click on the specified category for each article, even the draft ones show up. How can I fix it? #################

#models.py
from django.db import models
from django.utils import timezone


# my managers
class ArticleManager(models.Manager):
def published(self):
    return self.filter(status='Published')


# Create your models here.
class Category(models.Model):
title = models.CharField(max_length=300, verbose_name="Category Topic")
slug = models.SlugField(max_length=100, unique=True, verbose_name="Category Address")
status = models.BooleanField(default=True, verbose_name="Do you want to show?")
position = models.IntegerField(verbose_name="position")

class Meta:
    verbose_name = "Category"
    verbose_name_plural = "Categories"
    ordering = ['position']

def __str__(self):
    return self.title


class Article(models.Model):
STATUS_CHOICES = (
    ('Draft', 'Draft'),
    ('Published', 'Published')
)
title = models.CharField(max_length=300)
slug = models.SlugField(max_length=100, unique=True)
category = models.ManyToManyField(Category, verbose_name="Category", related_name="articles")
description = models.TextField()
thumbnail = models.ImageField(upload_to="images")
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES)

class Meta:
    ordering = ['-publish']

def __str__(self):
    return self.title

def category_published(self):
    return self.category.filter(status=True)

objects = ArticleManager()

############

#Views.py
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse, JsonResponse, Http404
from .models import Article, Category


# Create your views here.
def home(request):
context = {
    "articles": Article.objects.published()
}
return render(request, 'website/home.html', context)


def detail(request, slug):
context = {
    "article": get_object_or_404(Article.objects.published(), slug=slug)
}
return render(request, 'website/detail.html', context)


def article(request):
context = {
    "articles": Article.objects.filter(status="Published"),
    "category": Category.objects.filter(status=True)
}
return render(request, 'website/article.html', context)


def category(request, slug):
cat = get_object_or_404(Category, slug=slug, status=True)
context = {
    "category": cat.articles.all()
}
return render(request, 'website/category.html', context)

###########

#Category.html page
{% extends 'website/base.html' %}
{% load static %}
{% block main %}


  <main id="main">

<!-- ======= Breadcrumbs ======= -->
<section id="breadcrumbs" class="breadcrumbs">
  <div class="container">

    <div class="d-flex justify-content-between align-items-center">
      <h2>Blog</h2>
      <ol>
        <li><a href="home.html">Home</a></li>
        <li>Blog</li>
      </ol>
    </div>

  </div>
</section><!-- End Breadcrumbs -->

<!-- ======= Blog Section ======= -->

<section id="blog" class="blog">

  <div class="container">

    <div class="row">

      <div class="col-lg-8 entries">
{% for article in category %}
        <article class="entry" data-aos="fade-up">

          <div class="entry-img">
            <img src="{{ article.thumbnail.url }}" alt="" class="img-fluid">
          </div>

          <h2 class="entry-title">
            {{ article.title }}
          </h2>

          <div class="entry-meta">
            <ul>
              <li class="d-flex align-items-center"><i class="icofont-user"></i>
                  <a href="detail.html">John Doe</a></li>
              <li class="d-flex align-items-center"><i class="icofont-wall-clock"></i>
                  <a href="detail.html"><time>{{ article.publish }}</time></a></li>
                <li class="d-flex align-items-center"><i class="icofont-tags"></i>
                <ul class="tags">
                    {% for cat in article.category_published %}
                        <a href="{% url 'website:category' cat.slug %}">#{{ cat.title }}</a>
                    {% endfor %}
                </ul>
                  </li>
              <li class="d-flex align-items-center"><i class="icofont-comment"></i>
                  <a href="detail.html">12 Comments</a></li>
            </ul>
          </div>

          <div class="entry-content">
            {{ article.description|truncatewords:30}}
            <div class="read-more">
              <a href="{% url 'website:detail' article.slug %}">Read More</a>
            </div>
          </div>

        </article><!-- End blog entry -->

{% endfor %}

        <div class="blog-pagination">
          <ul class="justify-content-center">
            <li class="disabled"><i class="icofont-rounded-left"></i></li>
            <li><a href="#">1</a></li>
            <li class="active"><a href="#">2</a></li>
            <li><a href="#">3</a></li>
            <li><a href="#"><i class="icofont-rounded-right"></i></a></li>
          </ul>
        </div>

      </div><!-- End blog entries list -->

      <div class="col-lg-4">

        <div class="sidebar" data-aos="fade-left">

          <h3 class="sidebar-title">Search</h3>
          <div class="sidebar-item search-form">
            <form action="">
              <input type="text">
              <button type="submit"><i class="icofont-search"></i></button>
            </form>

          </div><!-- End sidebar search formn-->

{#              <h3 class="sidebar-title">Categories</h3>#}
{#              <div class="sidebar-item categories">#}
{#                <ul>#}
{#                  {% for cat in category %}#}
{#                 <li class="active"><a href="{% url 'website:category' cat.slug %}">#{{ cat.title 
}}</a></li>#}    
{#                  {% endfor %}#}
{#                </ul>#}
{##}
{#              </div><!-- End sidebar categories-->#}

          <h3 class="sidebar-title">Recent Posts</h3>
          <div class="sidebar-item recent-posts">
            <div class="post-item clearfix">
              <img src="assets/img/blog-recent-posts-1.jpg" alt="">
              <h4><a href="detail.html">Nihil blanditiis at in nihil autem</a></h4>
              <time datetime="2020-01-01">Jan 1, 2020</time>
            </div>

            <div class="post-item clearfix">
              <img src="assets/img/blog-recent-posts-2.jpg" alt="">
              <h4><a href="detail.html">Quidem autem et impedit</a></h4>
              <time datetime="2020-01-01">Jan 1, 2020</time>
            </div>

            <div class="post-item clearfix">
              <img src="assets/img/blog-recent-posts-3.jpg" alt="">
              <h4><a href="detail.html">Id quia et et ut maxime similique occaecati ut</a></h4>
              <time datetime="2020-01-01">Jan 1, 2020</time>
            </div>

            <div class="post-item clearfix">
              <img src="assets/img/blog-recent-posts-4.jpg" alt="">
              <h4><a href="detail.html">Laborum corporis quo dara net para</a></h4>
              <time datetime="2020-01-01">Jan 1, 2020</time>
            </div>

            <div class="post-item clearfix">
              <img src="assets/img/blog-recent-posts-5.jpg" alt="">
              <h4><a href="detail.html">Et dolores corrupti quae illo quod dolor</a></h4>
              <time datetime="2020-01-01">Jan 1, 2020</time>
            </div>

          </div><!-- End sidebar recent posts-->

          <h3 class="sidebar-title">Tags</h3>
          <div class="sidebar-item tags">
            <ul>
              <li><a href="#">App</a></li>
              <li><a href="#">IT</a></li>
              <li><a href="#">Business</a></li>
              <li><a href="#">Business</a></li>
              <li><a href="#">Mac</a></li>
              <li><a href="#">Design</a></li>
              <li><a href="#">Office</a></li>
              <li><a href="#">Creative</a></li>
              <li><a href="#">Studio</a></li>
              <li><a href="#">Smart</a></li>
              <li><a href="#">Tips</a></li>
              <li><a href="#">Marketing</a></li>
            </ul>

          </div><!-- End sidebar tags-->

        </div><!-- End sidebar -->

      </div><!-- End blog sidebar -->

    </div>

  </div>

</section><!-- End Blog Section -->

    </main><!-- End #main -->
{% endblock %}
Ali Ali
  • 101
  • 1
  • 6

1 Answers1

0

Your category view is returning all articles, if you just want published articles in the category you need to filter them.

def category(request, slug):
    # filter only published articles
    cat = get_object_or_404(Category, slug=slug, status=True)
    context = {
        "published_articles_in_category": cat.articles.filter(status='Published')
    }
Ben
  • 2,348
  • 1
  • 20
  • 23