Неверное перенаправление для одной категории сообщений

Я развиваю свой личный блог; у него только две категории, и я хотел бы иметь конкретный список сообщений для обеих категорий.

По этой причине я расширил get_absolute_url, как вы можете видеть ниже:

from django.db import models
from django.urls import reverse

CATEGORY_CHOICES = (
    ('G.I.S.', 'G.I.S.'),
    ('Sustainable Mobility', 'Sustainable Mobility'),
)

class Blog(models.Model):
    """
    Blog's post definition
    """
    title = models.CharField(
                max_length=70,
                unique=True,
                )
    slug = models.SlugField(
            unique=True,
            )
    contents = models.TextField()
    publishing_date = models.DateTimeField()
    category = models.CharField(
                    max_length=50,
                    choices=CATEGORY_CHOICES,
                    )

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        if Blog.objects.filter(category="G.I.S."):
            return reverse("gis_single_post", kwargs={"slug": self.slug})
        if Blog.objects.filter(category="Sustainable Mobility"):
            return reverse("sumo_single_post", kwargs={"slug": self.slug})

Ниже вы можете увидеть views.py; он имеет другую модель в зависимости от категории:

from django.shortcuts import render
from django.views.generic.list import ListView
from django.views.generic.detail import DetailView

from .models import Blog


class GisSinglePost(DetailView):
    model = Blog
    queryset = Blog.objects.filter(category="G.I.S.")
    context_object_name = 'post'
    template_name = "gis_single_post.html"


class GisListPost(ListView):
    model = Blog
    queryset = Blog.objects.filter(category="G.I.S.")
    context_object_name = 'posts'
    template_name = "gis_list_post.html"


class SuMoSinglePost(DetailView):
    model = Blog
    queryset = Blog.objects.filter(category="Sustainable Mobility")
    context_object_name = 'post'
    template_name = "sumo_single_post.html"


class SuMoListPost(ListView):
    model = Blog
    queryset = Blog.objects.filter(category="Sustainable Mobility")
    context_object_name = 'posts'
    template_name = "sumo_list_post.html"

А ниже есть urls.py с четырьмя путями:

from django.urls import include, path
from .views import GisSinglePost, GisListPost, SuMoListPost, SuMoSinglePost

urlpatterns = [
        path("gis/", GisListPost.as_view(), name="gis_list_post"),
        path("gis/<slug:slug>/", GisSinglePost.as_view(), name="gis_single_post"),
        path("sustainable-mobility/", SuMoListPost.as_view(), name="sumo_list_post"),
        path("sustainable-mobility/<slug:slug>/", SuMoSinglePost.as_view(), name="sumo_single_post"),
]

Когда я нажимаю на один пост категории ГИС, он без проблем показывает относительные детали. Но когда я нажимаю на сообщение другой категории, мне показывают это:

Страница не найдена (404) Метод запроса: URL запроса GET: http://127.0.0.1:8000/gis/erova-mobilita/ Автор: blog.views.GisSinglePost

Articolo не найдено, соответствующее запросу

Вы видите эту ошибку, потому что у вас есть DEBUG = True в вашем файле настроек Django. Измените его на False, и Django отобразит стандартную страницу 404.

Я застрял на этой проблеме в течение многих дней. Как я могу решить?


person Massimiliano Moraca    schedule 11.11.2018    source источник


Ответы (2)


Вы должны переопределить свой метод get_absolute_url. Поскольку экземпляры блога с категорией G.I.S. существуют, вы никогда не достигнете второго места, если экземпляры блога с категорией Устойчивая мобильность.

def get_absolute_url(self):
    if self.category == "G.I.S.":
        return reverse("gis_single_post", kwargs={"slug": self.slug})
    elif self.category == "Sustainable Mobility":
       return reverse("sumo_single_post", kwargs={"slug": self.slug})
person Uroš Trstenjak    schedule 11.11.2018
comment
Как я могу переопределить его? - person Massimiliano Moraca; 11.11.2018
comment
Пожалуйста, смотрите отредактированный ответ. Хорошо, я вижу, что кто-то вскочил прямо с ответом. Разумеется, без объяснения причин. Интересный подход. - person Uroš Trstenjak; 11.11.2018

Попробуйте переопределить get_absolute_url(self) следующим образом:

def get_absolute_url(self):
    if self.category == "G.I.S.":
        return reverse("gis_single_post", kwargs={"slug": self.slug})
    if self.category == "Sustainable Mobility":
        return reverse("sumo_single_post", kwargs={"slug": self.slug})
person Sergey Snow    schedule 11.11.2018