Django 错误报告,不同的外键作为 URL 参数将导致详细视图不执行

Django bug report, different foreign key as URL parameter will cause detailed view not executing

编辑3: 罪魁祸首是 re_path,不是外键

原文:

这个错误非常微妙,我真的找不到合适的方式来描述它,例如我有两个应用程序,新闻和博客

在 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是在同一个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'),
]

此处使用外键作为url参数

在博客中 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)

新闻视图,新闻 urls,新闻模板,除了名称和模板名称外,与博客完全相同,基本上将每个“博客”替换为“新闻”

那么这就是错误发生的地方,只会执行一个详细视图,例如当有人单击“{%url "blogspage" blog.blog_type blog.id%}”时它将转到 url blog/blog_type/pk 但是内容将是新闻,但是,如果从 url 参数中删除 <foreignkey> blog_type,只有这样才能执行博客的详细视图并呈现正确的博客内容。

新闻 url.py:

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

root url.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('news.urls')),
    path('blogs/',include('blogs.urls')),
] # path('news/', include('news.urls')), will not conflit
# switch the position between blogs.urls and news.urls also no conflit

编辑www.example.com/blogs/blog_type/1 and www.example.com/news/news_type/1 will not conflit but www.example.com/blogs/blog_type/1 and www.example.com/news_type/1

Edit2: 因为 "" 和 "/blogs" 有问题我自动假设 "/blogs" 和 "/news" 也会有问题,但问题只存在于 "" 之间和“/博客”

这看起来像是 Django pathre_path 方法的问题,根据您的情况,re_path 用于博客和新闻 URLs 用于 newspageblogpage 匹配,django 无法解析正确的 URL 并在第一个匹配 URL.

上重定向