Edit3: 罪魁禍首是 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'),
]
這里使用 forignkey 作為 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)
新聞瀏覽量,新聞網址,新聞模板,除了名稱和模板名稱外,與博客完全相同,基本上將每個“博客”替換為“新聞”
Then here is where the bug would occur, Only one detailed view will ever execute, for example when someone clicks "{%url "blogspage" blog.blog_type blog.id%}" It will go to url blog/blog_type/pk but the content will be news, However, If <foreignkey> blog_type is removed from url parameter, Only then the detailed view of blog will execute and the correct blog content will be rendered.
news 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
Edit: 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 will
Edit2: Because "" and "/blogs" bugged I automatically assume "/blogs" and "/news" will also bug, But the bug only exist between "" and "/blogs"
uj5u.com熱心網友回復:
這看起來像是 Djangopath和re_path方法的問題,根據您的情況re_path,博客和新聞 URLnewspage和 和blogpage的匹配和 django 無法決議正確的 URL 并重定向到第一個匹配的 URL。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358590.html
標籤:django debugging url django-class-based-views
上一篇:為什么這個字符比較會導致錯誤?
