Сообщение об ошибке Django, другой внешний ключ в качестве параметра URL приводит к тому, что подробное представление не выполняется

Этот баг настолько тонкий, что я не смог найти подходящий способ его описать, Например, у меня есть два приложения, Новости и Блоги

В модели blogs.py у меня есть что-то вроде этого:

class BlogType(models.Model):
    blog_type = CharField(max_length=20)
    def __str__(self):
        return self.blog_type

class Blogs(models.Model):
    title = models.CharField(max_length=20)
    blog_author = models.ForeignKey(User, on_delete=models.CASCADE)
    blog_type = models.ForeignKey(BlogType, on_delete=models.DO_NOTHING)

здесь blog_type - это foreignkey, определенный внутри того же models.py

В блогах url.py

from django.urls import path, re_path
from . import views
from .views import blogspage

urlpatterns = [
    path('', views.blogs, name='blogs'),
    re_path(r'(?P<blog_type>[\w-]+)/(?P<pk>[0-9]+)$', blogspage.as_view(), name='blogspage'),
]

Здесь используется forignkey в качестве параметра url

И в blogs views.py

class blogspage(DetailView):
    model=Blogs
    template_name='blogs/blogspage.html'
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        print('Print the object if this is executed', self.get_object())

В шаблоне Django вы бы передали что-то вроде:

<div><a href="{% url 'blogspage' b.blog_type b.id %}">{{b.title}}</a></div>

Теперь в новостной модели model.py у вас есть:

class NewsType(models.Model):
    news_type = CharField(max_length=20)
    def __str__(self):
        return self.news_type

class News(models.Model):
    title = models.CharField(max_length=20)
    news_author = models.ForeignKey(User, on_delete=models.CASCADE)
    news_type = models.ForeignKey(NewsType, on_delete=models.DO_NOTHING)

Виды новостей, урлы новостей, шаблоны новостей, точно такие же, как и блог, за исключением названия и названия шаблона, в основном заменяя все "blogs" на "news"

Тогда вот где произойдет ошибка, Только один детальный вид будет когда-либо выполняться, например, когда кто-то нажимает "{%url "blogspage" blog.blog_type blog.id%}" Он перейдет к url blog/blog_type/pk, но содержание будет новостным, Однако, Если <foreignkey> blog_type удалено из параметра url, Только тогда детальный вид блога будет выполняться и правильное содержание блога будет отображаться.

Спасибо @HelloWorld, для меня это выглядит как проблема с Django path и методом re_path, где согласно вашему сценарию re_path для обоих блогов и новостей url для newspage и blogpage совпадают и django не может разрешить правильный url и перенаправить на первый совпадающий url.

Вернуться на верх