【问题标题】:Django DayArchiveview is not detected in urls.py在 urls.py 中未检测到 Django DayArchiveview
【发布时间】:2021-04-14 23:24:43
【问题描述】:

我在 Django 中创建了几个基于日期的视图,虽然年份和月份的视图按预期运行,但未检测到显示日期的视图。例如,如果我尝试获取http://127.0.0.1:8000/blog/archive/2021/http://127.0.0.1:8000/blog/archive/2021/01 将显示视图,http://127.0.0.1:8000/blog/archive/2021/01/07 将失败。我知道问题必须与 urls.py 配置有关,但我只是在文档中找不到它。我还尝试将 day_format='%d' 传递给 as_view 方法,但没有任何结果。

urls.py

from django.urls import path, re_path

from blog import views

app_name = 'blog'

urlpatterns = [
    # Example: /blog/
    path('', views.PostListView.as_view(), name='index'),

    # Example: /blog/post/ (same as /blog/)
    path('post/', views.PostListView.as_view(), name='post_list'),

    # Example: /blog/post/django-example/
    re_path(r'^post/(?P<slug>[-\w]+)/$', views.PostDetailView.as_view(), name='post_detail'),

    # Example: /blog/archive/
    path('archive/', views.PostArchiveView.as_view(), name='post_archive'),

    # Example: /blog/archive/2019/
    path('archive/<int:year>/', views.PostYearArchiveView.as_view(), name='post_year_archive'),

    # Example: /blog/archive/2019/nov/
    path('archive/<int:year>/<int:month>/', views.PostMonthArchiveView.as_view(month_format='%m'), name='post_month_archive'),

    # Example: /blog/archive/2019/nov/10/
    path('archive/<int:year>/<str:month>/<int:day>/', views.PostDayArchiveView.as_view(), name='post_day_archive'),

    # Example: /blog/archive/today/
    path('archive/today/', views.PostTodayArchiveView.as_view(), name='post_today_archive'),
]

views.py

from django.shortcuts import render

# Create your views here.
from django.views.generic import ListView, DetailView, ArchiveIndexView, YearArchiveView, MonthArchiveView, \
    DayArchiveView, TodayArchiveView

from blog.models import Post


class PostListView(ListView):
    model = Post
    template_name = 'blog/post_all.html'
    context_object_name = 'posts'
    paginate_by = 2


class PostDetailView(DetailView):
    model = Post


class PostArchiveView(ArchiveIndexView):
    model = Post
    date_field = 'modify_dt'


class PostYearArchiveView(YearArchiveView):
    model = Post
    date_field = 'modify_dt'
    make_object_list = True


class PostMonthArchiveView(MonthArchiveView):
    model = Post
    date_field = 'modify_dt'


class PostDayArchiveView(DayArchiveView):
    model = Post
    date_field = 'modify_dt'


class PostTodayArchiveView(TodayArchiveView):
    model = Post
    date_field = 'modify_dt'

post_archive_day.html

<h1>Post Archives for {{ day|date:"N d, Y" }}</h1>

<div>
    <ul>
        {% for post in object_list %}
        <li>
            {{ post.modify_dt|date:"Y-m-d" }}&nbsp;&nbsp;&nbsp;
            <a href="{{ post.get_absolute_url }}"><strong>{{ post.title }}</strong></a>
        </li>
        {% endfor %}
    </ul>
</div>

错误

【问题讨论】:

    标签: python django


    【解决方案1】:

    您的 URL 模式匹配正确,具体而言,'archive/&lt;int:year&gt;/&lt;str:month&gt;/&lt;int:day&gt;/' 将与 URL http://127.0.0.1:8000/blog/archive/2021/01/07 匹配。

    错误消息指示无效的日期字符串。它期望指定为%b 的月份字段是一个缩写月份name。因此,根据urls.py 中您的 URL 模式上方的评论,您的 URL 应该是 http://127.0.0.1:8000/blog/archive/2021/jan/07

    更新

    您可以通过在您的PostDayArchiveView 中设置month_format 将预期月份格式更改为用零填充的月份数。

    class PostDayArchiveView(DayArchiveView):
        model = Post
        date_field = 'modify_dt'
        month_format = '%m'
    

    现在您可以使用 URL 模式 'archive/&lt;int:year&gt;/&lt;int:month&gt;/&lt;int:day&gt;/' 来接受所需的 URL 格式。

    【讨论】:

    • 我将 archive//// 替换为 archive/// / 但它不再像同样的错误一样工作
    • 月份必须是月份的缩写名称。这是在DayArchiveView 通用视图中硬编码的。更改 URL 模式以匹配整数不会改变这一点。
    • 那么我应该在哪里修复什么?
    • 如果您可以接受月份使用缩写月份名称格式,则无需修复任何内容。这就是通用日期视图接受的内容,我认为它们不能(容易)被覆盖。
    • 但是当我使用 %m 并将 替换为 时,错误仍然存​​在
    【解决方案2】:

    您可以尝试以这种方式获取日期 ->http://127.0.0.1:8000/blog/archive/2021-01-07 而不是这种方式 -> http://127.0.0.1:8000/blog/archive/2021/01/07。这将是一种更简单的方式来处理您想要的事情

    from django.urls import path, register_converter
    from datetime import datetime
    from . import views
    
    class DateConverter:
        regex = '\d{4}-\d{2}-\d{2}'
    
        def to_python(self, value):
            return datetime.strptime(value, '%Y-%m-%d')
    
        def to_url(self, value):
           return value
    
    register_converter(DateConverter, 'yyyy')
    
    urlpatterns = [
        path('', views.index, name='index'),
        path('date/<yyyy:date>/', views.date, name='date'),
    ]
    

    this问题中所述

    【讨论】:

    • OP 正在使用通用日期视图,该视图需要特定格式的日期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2011-12-09
    • 2019-05-06
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多