Python 如何使用URL regexp匹配Django中帖子的确切日期?
我正在使用Django为自己开发一个网站和博客。我使用的是Python3.8和Django3.0,在URL中包含帖子创建日期时遇到了很多麻烦。虽然我终于能够让我的URL看起来像:“mywebsite.com/blog/2020/mm/dd/.html”,但如果我更改了日期的任何部分,我不会得到404 例如,如果我手动将URL更改为:mywebsite.com/blog/2021/mm/dd/.html,则网页仍会加载而不显示错误有人能帮我找出哪里可以编辑代码来纠正这个问题吗?如果URL不是从datetime字段中提取的内容,我可以在其中发出404?My models.py、views.py和URL.py附在下面: 型号.pyPython 如何使用URL regexp匹配Django中帖子的确切日期?,python,django,django-models,url-rewriting,django-views,Python,Django,Django Models,Url Rewriting,Django Views,我正在使用Django为自己开发一个网站和博客。我使用的是Python3.8和Django3.0,在URL中包含帖子创建日期时遇到了很多麻烦。虽然我终于能够让我的URL看起来像:“mywebsite.com/blog/2020/mm/dd/.html”,但如果我更改了日期的任何部分,我不会得到404 例如,如果我手动将URL更改为:mywebsite.com/blog/2021/mm/dd/.html,则网页仍会加载而不显示错误有人能帮我找出哪里可以编辑代码来纠正这个问题吗?如果URL不是从da
class Blog(models.Model):
title = models.CharField(max_length=500, help_text='Title of the Blog Post')
author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True)
**created_on = models.DateTimeField(auto_now_add=True)
updated_on = models.DateTimeField(auto_now=True)
content = models.TextField(help_text='Content of the Blog Post')
topic = models.ManyToManyField(Topic, help_text='Topic of this Blog Post')
slug = models.SlugField(
null=False,
unique=True,
max_length=500,
editable=False,
)
class Meta:
ordering = ['-created_on']
def __str__(self):
return self.title
def get_absolute_url(self):
kwargs = {
'year': self.**created_on.strftime("%Y"),
'month': self.**created_on.strftime("%m"),
'day': self.**created_on.strftime("%d"),
'slug': self.slug,
}
return reverse('blog-detail', kwargs=kwargs)
def save(self, *args, **kwargs):
self.slug = slugify(self.title, allow_unicode=True)
super(Blog, self).save(*args, **kwargs)
class BlogListView(ListView):
model = Blog
template_name = 'blog_list.html'
class BlogDetailView(DetailView):
model = Blog
context_name = 'blog-detail'
**year_url_kwarg = 'year'
slug_url_kwarg = 'slug'
**month_url_kwarg = 'month'
**day_url_kwarg = 'day'
urlpatterns = [
path('index/',views.index, name='index'),
**re_path(r'^blog/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/(?P<slug>[-\w]+)$', views.BlogDetailView.as_view(), name='blog-detail'),
re_path(r'^blog/$',views.BlogListView.as_view(), name='blog_main'),
]
视图.py
class Blog(models.Model):
title = models.CharField(max_length=500, help_text='Title of the Blog Post')
author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True)
**created_on = models.DateTimeField(auto_now_add=True)
updated_on = models.DateTimeField(auto_now=True)
content = models.TextField(help_text='Content of the Blog Post')
topic = models.ManyToManyField(Topic, help_text='Topic of this Blog Post')
slug = models.SlugField(
null=False,
unique=True,
max_length=500,
editable=False,
)
class Meta:
ordering = ['-created_on']
def __str__(self):
return self.title
def get_absolute_url(self):
kwargs = {
'year': self.**created_on.strftime("%Y"),
'month': self.**created_on.strftime("%m"),
'day': self.**created_on.strftime("%d"),
'slug': self.slug,
}
return reverse('blog-detail', kwargs=kwargs)
def save(self, *args, **kwargs):
self.slug = slugify(self.title, allow_unicode=True)
super(Blog, self).save(*args, **kwargs)
class BlogListView(ListView):
model = Blog
template_name = 'blog_list.html'
class BlogDetailView(DetailView):
model = Blog
context_name = 'blog-detail'
**year_url_kwarg = 'year'
slug_url_kwarg = 'slug'
**month_url_kwarg = 'month'
**day_url_kwarg = 'day'
urlpatterns = [
path('index/',views.index, name='index'),
**re_path(r'^blog/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/(?P<slug>[-\w]+)$', views.BlogDetailView.as_view(), name='blog-detail'),
re_path(r'^blog/$',views.BlogListView.as_view(), name='blog_main'),
]
url.py
class Blog(models.Model):
title = models.CharField(max_length=500, help_text='Title of the Blog Post')
author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True)
**created_on = models.DateTimeField(auto_now_add=True)
updated_on = models.DateTimeField(auto_now=True)
content = models.TextField(help_text='Content of the Blog Post')
topic = models.ManyToManyField(Topic, help_text='Topic of this Blog Post')
slug = models.SlugField(
null=False,
unique=True,
max_length=500,
editable=False,
)
class Meta:
ordering = ['-created_on']
def __str__(self):
return self.title
def get_absolute_url(self):
kwargs = {
'year': self.**created_on.strftime("%Y"),
'month': self.**created_on.strftime("%m"),
'day': self.**created_on.strftime("%d"),
'slug': self.slug,
}
return reverse('blog-detail', kwargs=kwargs)
def save(self, *args, **kwargs):
self.slug = slugify(self.title, allow_unicode=True)
super(Blog, self).save(*args, **kwargs)
class BlogListView(ListView):
model = Blog
template_name = 'blog_list.html'
class BlogDetailView(DetailView):
model = Blog
context_name = 'blog-detail'
**year_url_kwarg = 'year'
slug_url_kwarg = 'slug'
**month_url_kwarg = 'month'
**day_url_kwarg = 'day'
urlpatterns = [
path('index/',views.index, name='index'),
**re_path(r'^blog/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/(?P<slug>[-\w]+)$', views.BlogDetailView.as_view(), name='blog-detail'),
re_path(r'^blog/$',views.BlogListView.as_view(), name='blog_main'),
]
urlpatterns=[
路径('index/',views.index,name='index'),
**re_path(r'^blog/(?P\d{4})/(?P\d{2})/(?P\d{2})/(?P[-\w]+)$,views.blogdailview.as_view(),name='blog-detail'),
re_路径(r'^blog/$,views.BlogListView.as_view(),name='blog'u main'),
]
我在代码中加入**,以引起对相关字段的注意。感谢您花时间通读并试图帮助我解决这个问题 您可以通过覆盖以下内容进行筛选:
类BlogDetailView(DetailView):
模型=博客
context_name='blog detail'
def get_queryset(self、*args、**kwargs):
return super().get_queryset(*args,**kwargs).filter(
创建于年=self.kwargs['year'],
在月=self.kwargs['month']上创建月,
创建日期=self.kwargs['day']
)
注意:我建议为context\u name
使用一个有效的Python标识符,因此不要使用连字符。虽然它可以在模板引擎中工作,但也有可能稍后它们会稍微更改Django模板引擎的“语法”
这很好用!非常感谢你。我还将更改上下文名称,使其不包含连字符。这非常有帮助