Статья не добавляется к категории Django

Govard

Новичок
Пользователь
Апр 21, 2020
22
4
3
Здравствуйте. Мне нужна ваша помощь снова.
Я хочу создать архив гороскопов. Для этого я создал категории из 12 месяцев и так же в админке когда я создаю саму статью с гороскопом, то статья привязывается к определенному месяцу(категории). Когда вывожу в шаблоне через for, то у меня выводится только первая статья гороскопа, а остальные которые привязаны к этому месяцу(категории) они не выводятся. Как мне сделать так, чтобы в каждом месяце(категории) выводились все те статьи которые к категории привязаны?

models.py

Python:
class Horoscope(models.Model):
     title = models.CharField(max_length=150, verbose_name='Заголовок гороскопа')
     content = models.TextField(blank=False, verbose_name='Текст гороскопа')
     photo = models.ImageField(upload_to='photos_horosсope/%Y/%m/%d/', verbose_name='Картинка гороскопа', blank=True)
     slug = models.SlugField(max_length=150, unique=True, verbose_name='Слаг гороскопа')
     views = models.IntegerField(default=0, verbose_name='Просмотры')
     category_horoscopes = models.ForeignKey('CategoryHoroscopes', verbose_name='Месяц', on_delete=models.PROTECT, related_name='horoscopes')  # on_delete=models.PROTECT - защита от удаления статей привязанных к категории.

     def get_absolute_url(self):
          return reverse('horoscope', kwargs={"slug": self.slug})

     def __str__(self):
          return self.title

     def save(self, *args, **kwargs):
         value = self.title
         self.slug = slugify(value)
         super().save(*args, **kwargs)

     class Meta:
          verbose_name = 'Гороскоп'
          verbose_name_plural = 'Гороскопы'
          ordering = ['-title']  # '-created_ad' - посты в обратном порядке. Свежие первые.


class CategoryHoroscopes(models.Model):
     title = models.CharField(max_length=150, db_index=True, verbose_name='Категория гороскопа')
     slug = models.SlugField(max_length=150, unique=True, verbose_name='Слаг категории')

     def get_absolute_url(self):
          return reverse('category-horoscopes', kwargs={"slug": self.slug})

     def __str__(self):
          return self.title

     def save(self, *args, **kwargs):
         value = self.title
         self.slug = slugify(value)
         super().save(*args, **kwargs)

     class Meta:
          verbose_name = 'Категория гороскопа'
          verbose_name_plural = 'Категории гороскопов'
          ordering = ['title']

views.py

Python:
class HoroscopePage(ListView):
    template_name = 'news/horoscope.html'
    context_object_name = 'horoscopes_item'

    def get_queryset(self):
        return Horoscope.objects.all().order_by('pk')[:6]

templatags
horoscope_order.py

Python:
from django import template
from news.models import Horoscope

register = template.Library()


@register.simple_tag(name='horoscope_ordering')
def get_horoscope_articles():
    return Horoscope.objects.all().order_by('pk')[6:12]

urls.py

Python:
path('horoscope/<slug>/', HoroscopeDetailView.as_view(), name='horoscope'),
path('category-horoscopes/<slug>/', HoroscopeByCategory.as_view(), name='category-horoscopes'),
path('horoscopes/', HoroscopePage.as_view(), name='horoscopes'),

horoscope.html

HTML:
{% include 'inc/_nav.html' %}

{% load horoscope_order %}
{% horoscope_ordering as horoscopes_item2 %}

{% load last_horoscope %}
{% horoscope_last as horoscope_item3 %}

<body>
<div class="color-main-horoscope">
    <div id="col-horoscope">

        <div class="popular-horoscope">
            <h2>Гороскоп</h2>
        </div>


        <div class="card mb-3" id="main-card-horoscope">
            <div class="card-header" id="cat-views">
                <p id="category-detail"> Месяц: <a href="{{ horoscope_item3.category_horoscopes.get_absolute_url }}">{{ horoscope_item3.category_horoscopes.title }}</a></p>
            </div>
            <div class="card-body-horoscope">
                <h5 class="card-title text-center">{{ horoscope_item3.title }}</h5>
                <p class="card-text">{{ horoscope_item3.content | safe | linebreaks }}</p>

                <div class="container">

                    <div class="pull-left" id="rt-logo-horoscope">
                        <img src="{{ horoscope_item3.photo.url }}" alt="" width="700" height="600">
                    </div>

                </div>
            </div>
        </div>

        <div class="popular-horoscope">
                <h2>Архив гороскопов</h2>
            </div>

        <div id="horoscope-flex">

            <div class="main-horoscope">
                {% for item in horoscopes_item %}
                <div class="media-horoscope">
                    <a href="{% url 'category-horoscopes' item.category_horoscopes.slug %}"><h4>{{ item.category_horoscopes.title }}</h4></a>
                    <a href="{{ item.get_absolute_url }}"><h5>{{ item.title }}</h5></a>
                </div>
                {% endfor %}
            </div>

            <div class="main-horoscope2">
                {% for item in horoscopes_item2 %}
                <div class="media-horoscope2">
                    <a href="{% url 'category-horoscopes' item.category_horoscopes.slug %}"><h4>{{ item.category_horoscopes.title }}</h4></a>
                    <a href="{{ item.get_absolute_url }}"><h5>{{ item.title }}</h5></a>
                </div>
                {% endfor %}
            </div>
        </div>
    </div>
</div>
<div id="space-5">

</div>
</body>
 

Вложения

  • 127.0.0.18000horoscopes - Google Chrome.jpg
    127.0.0.18000horoscopes - Google Chrome.jpg
    585,4 КБ · Просмотры: 3
  • Мне нравится
Реакции: Student

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Как мне сделать так, чтобы в каждом месяце(категории) выводились все те статьи которые к категории привязаны?
Можно во вью HoroscopePage передавать в шаблон не гороскопы, а их категории и в шаблоне выводить категорию и все гороскопы из нее.
views.py
Python:
from django.views.generic import ListView

from .models import CategoryHoroscopes


class HoroscopePage(ListView):
    template_name = 'news/horoscope.html'
    context_object_name = 'categories'

    def get_queryset(self):
        return CategoryHoroscopes.objects.all()

horoscope.html
HTML:
<body>
{% for category in categories %}
    <h2>{{category}}</h2>
    <ul>
        {% if category.horoscopes.all %}
            {% for horoscope in category.horoscopes.all %}
                <h3>{{horoscope}}</h3>
                <p>{{horoscope.content}}</p>
            {% endfor%}
        {% endif %}
    </ul>
{% endfor %}
</body>
 
  • Мне нравится
Реакции: Student и Govard

Govard

Новичок
Пользователь
Апр 21, 2020
22
4
3
Можно во вью HoroscopePage передавать в шаблон не гороскопы, а их категории и в шаблоне выводить категорию и все гороскопы из нее.
views.py
Python:
from django.views.generic import ListView

from .models import CategoryHoroscopes


class HoroscopePage(ListView):
    template_name = 'news/horoscope.html'
    context_object_name = 'categories'

    def get_queryset(self):
        return CategoryHoroscopes.objects.all()

horoscope.html
HTML:
<body>
{% for category in categories %}
    <h2>{{category}}</h2>
    <ul>
        {% if category.horoscopes.all %}
            {% for horoscope in category.horoscopes.all %}
                <h3>{{horoscope}}</h3>
                <p>{{horoscope.content}}</p>
            {% endfor%}
        {% endif %}
    </ul>
{% endfor %}
</body>

Спасибо большое)) как всегда вы лучший))))))))
 
  • Мне нравится
Реакции: Student

Форум IT Специалистов