如何使用URL regexp匹配Django中帖子的确切日期?

2024-04-16 18:20:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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附在下面:

型号.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)

视图.py

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'

url.py

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'),

]

我在代码中加入**,以引起对相关字段的注意。感谢您花时间通读并试图帮助我解决这个问题


Tags: namepyselftrueurlonmodelsblog
1条回答
网友
1楼 · 发布于 2024-04-16 18:20:04

您可以通过覆盖^{} method [Django-doc]进行筛选:

class BlogDetailView(DetailView):
    model = Blog
    context_name = 'blog-detail'

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).filter(
            created_on__year=self.kwargs['year'],
            created_on__month=self.kwargs['month'],
            created_on__day=self.kwargs['day']
        )

Note: I would advise using an name for context_name that is a valid Python identifier, so not something with a hyphen. While it might work in the template engine, it is possible that later they slightly change the "grammar" of the Django template engine.

相关问题 更多 >