【问题标题】:Django ListView Page Not Found找不到 Django ListView 页面
【发布时间】:2016-03-04 17:58:56
【问题描述】:

所以在升级到 Django 1.9 后,我遇到了 ListViews 和 url 匹配这个奇怪的问题。在开发中一切正常,但我认为 ListView 子类在生产中抛出 404(CherryPy/IIS 使用 FORCE_SCRIPT_NAME = '/project'):

404 错误消息:

    Using the URLconf defined in project.urls, Django tried these URL patterns, in this order:
         1. ^$ [name='home']
         2. ^things/
         3. ^otherstuff/
    The current URL, project/things/, didn't match any of these.

项目主 urls.py:

    urlpatterns = [
        url(r'^$', RedirectView.as_view(url=reverse_lazy("start")), name="home"),
        url(r'^things/', include('things.urls')),
        url(r'^otherstuff/', include('otherstuff.urls'))
    ]

东西 urls.py:

    urlpatterns = [

        url(r'^start/$', views.Start.as_view(), name="start"),
        url(r'^dashboard/$', views.Dashboard.as_view(), name="dashboard"),
        url(r'^stats/$', views.Statistics.as_view(), name="statistics"),

        # --- Trouble here ---
        url(r'^$', views.AllThingsList.as_view(), name="all-things"),
        url(r'^sublistthings/$', views.ThingsSubList.as_view(), name="sub-list-things"),
        # --- End trouble ---

        url(r'^selectthing/$', views.SelectThing.as_view(), name="select-thing"),
        url(r'^(?P<pk>\d+)/$', views.Thing.as_view(), name="thing")
    ]

每个 url 都匹配得很好,除了那些我标记为麻烦的。与这些 url 相关的视图扩展了以下类:

    class BaseThingsListView(ListView):

        def get(self, request, *args, **kwargs):
            """
            return regular list view on page load and then json data on
            datatables ajax request.
            """

            ...

            self.object_list = self.get_queryset()

            # --- Trouble here ---
            if not self.request.is_ajax():
                return super(BaseThingsListView, self).get(request, *args, **kwargs)
            # --- End Trouble ---                

            ...

            context = {ajax_stuff}
            return HttpResponse(json.dumps(context), content_type='application/json')

        # Other methods include:
        def get_table_context_data(self, **kwargs):
        def get_context_data(self, *args, **kwargs):
        def get_header_for_field(self, field):
        def set_page(self):
        def get_paginate_by(self, queryset):
        def get_queryset(self):
        def filter_queryset(self, qs):
        def order_queryset(self, qs):
        def get_rows(self, objects):
        def format_col(self, field, obj):
        def set_query_params(self):

如果我注释掉上面有问题的部分,会按预期返回一个 ajax 对象,并且不会抛出 404。另请注意,allow_empty 是 True,无论如何都会引发不同的错误消息。

那么返回 ListViews 的 get() 会导致这种情况只在生产环境中发生的原因是什么?还是其他地方的问题?

更新:

django.core.urlresolvers.Resolver404 在类 Template(object) 的 \django\template\backends\django.py 第 95 行中生成:

        return self.template.render(context)

...调试器获取并生成误导性的 404 消息。我的模板加载器设置不正确吗?真的不知道从这里去哪里。

【问题讨论】:

    标签: django django-views django-generic-views


    【解决方案1】:

    你破坏了 urls.py url(r'^sublistthings/$', views.ThingsSubList.as_view(), name="sub-list-things"),name="complete-details"), 您通过添加额外的name="complete-details"), 犯了一个错误

    而且也没有匹配'^script_name/'模式的url

    【讨论】:

    • 糟糕,第一个错误是我将代码转录到此处。使用 FORCE_SCRIPT_NAME 时会附加 script_name。我进行了编辑以显示更有意义的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 2016-08-01
    • 2015-10-22
    • 2014-03-20
    • 2019-01-22
    • 2020-10-27
    • 2019-07-21
    相关资源
    最近更新 更多