Сообщение об ошибке 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.