Django - URL 使用通用视图未找到

Django - URL not found using generic views

我正在编写一个基本的事件应用程序,到目前为止它包含两个模块(应用程序):用户和事件。

我在 Ubuntu 16.04

上使用 Django 2.1 和 Python 3.6

到目前为止,我已经能够处理用户,但在事件中,我无法使用更新、详细信息和删除通用视图。全部 return 404.

我的views.py:

class EventListView(ListView):

    model = EventModel
    template_name = 'event_list.html'
    queryset = EventModel.objects.order_by('start_date_time')


class EventUpdateView(UpdateView):

    model = EventModel
    fields = ['event_type','start_date_time'
              ]
    template_name = 'event_update.html'


class EventDeleteView(DeleteView):

    model = EventModel
    template_name = 'event_delete.html'
    success_url = reverse_lazy('event_list')


class EventDetailView(DetailView):

    model = EventModel
    template_name = 'event_detail.html'

我的urls.py(在项目文件夹中):

urlpatterns = [
path('', include('pages.urls')),
path('admin/', admin.site.urls),
path('users/', include('users.urls')),
path('users/', include('django.contrib.auth.urls')),
path('events/', include('events.urls')),
]

我的 urls.py(在活动应用程序中):

urlpatterns = [
path('', views.EventListView.as_view(), name='event_list'),
path('<int:id>', views.EventDetailView.as_view(), name='event_detail'),
path('<int:id>/edit/', views.EventUpdateView.as_view(), name='event_update'),
path('<int:id>/delete/', views.EventDeleteView.as_view(), name='event_delete'),
]

我做错了什么?我整天都在搜索,但仍然不知道这怎么可能是错的。 请注意,第一行有效(EventListView),但其他行无效。顺便说一下,我正在使用 Django for Beginners 这本书。这里的大部分代码与书中的代码完全相同。

更新

我没有在这个应用程序中使用名称空间,urls.py 的其余部分只是一些基本的导入:

from django.urls import path
from . import views

项目的 urls.py 与上面类似,除了它还有 include 和 admin。

给出 404 错误的 URL 示例:

http://127.0.0.1:8000/events/1/
http://127.0.0.1:8000/events/1/edit/

PS 我以为编辑和删除给我 404,但实际上错误是:

ImproperlyConfigured at /events/1/edit/ EventUpdateView is missing a QuerySet. Define EventUpdateView.model, EventUpdateView.queryset, or override EventUpdateView.get_queryset().)

简而言之:你定义了一个模型<b>s</b>(用s ) 属性,但它应该是 model(没有 s)。

其实这个错误已经说明问题了:

ImproperlyConfigured at /events/1/edit/ EventUpdateView is missing a QuerySet. 
Define EventUpdateView.model, EventUpdateView.queryset,
or override EventUpdateView.get_queryset().)

在你的 EventUpdateView 中你没有指定 model 属性,你写了 model<b>s</b>,对于 Django,这是一个完全不同的属性。所以你应该将它重命名为:

class EventListView(ListView):
    <b>model</b> = EventModel
    template_name = 'event_list.html'
    queryset = EventModel.objects.order_by('start_date_time')

class EventUpdateView(UpdateView):
    <b>model</b> = EventModel
    fields = ['event_type','start_date_time'
              ]
    template_name = 'event_update.html'

class EventDeleteView(DeleteView):
    <b>model</b> = EventModel
    template_name = 'event_delete.html'
    success_url = reverse_lazy('event_list')


class EventDetailView(DetailView):
    <b>model</b> = EventModel
    template_name = 'event_detail.html'

对于 EventListView,这无关紧要,因为您还定义了一个 queryset 属性,所以 Django 使用了那个属性,但我还是会更新它。

另外在urls.py中需要默认指定一个pk参数:

urlpatterns = [
    path('', views.EventListView.as_view(), name='event_list'),
    path('<int:<b>pk</b>>', views.EventDetailView.as_view(), name='event_detail'),
    path('<int:<b>pk</b>>/edit/', views.EventUpdateView.as_view(), name='event_update'),
    path('<int:<b>pk</b>>/delete/', views.EventDeleteView.as_view(), name='event_delete'),
]

最后在模板中你写了类似的东西:

{% url 'event_update' event.id %}

但显然没有 event 标识符,因此 event.idstring_if_invalid(默认情况下为空字符串),它不是整数(至少如果您没有指定则不会),因此找不到相关的 URL。经过一番讨论,原来正确的标识符是object,所以正确的url是这样的:

{% url 'event_update' pk=<b>object.id</b> %}

其他 {% url ... %} 调用当然也应该发生同样的情况。