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 path
和 re_path
方法的问题,根据您的情况,re_path
用于博客和新闻 URLs 用于 newspage
和 blogpage
匹配,django 无法解析正确的 URL 并在第一个匹配 URL.
上重定向
编辑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 path
和 re_path
方法的问题,根据您的情况,re_path
用于博客和新闻 URLs 用于 newspage
和 blogpage
匹配,django 无法解析正确的 URL 并在第一个匹配 URL.