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

时间:2018-08-19 11:55:58

标签: python django django-urls

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

我正在Ubuntu 16.04上使用Django 2.1和Python 3.6

到目前为止,我已经能够处理用户,但是在事件上,我不能使用“更新”,“详细信息”和“删除”通用视图。它们都返回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入门书籍。这里的大多数代码与本书中的代码相同。

更新

我不在此应用程序中使用名称空间,urls.py的其余部分仅是一些基本的导入:

from django.urls import path
from . import views

该项目的urls.py与上面类似,不同之处在于它还包含了include和admin。

URL出现404错误的示例:

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

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

  

在/ events / 1 / edit /中配置不正确   EventUpdateView缺少QuerySet。定义EventUpdateView.model,EventUpdateView.queryset或覆盖EventUpdateView.get_queryset()。)

1 个答案:

答案 0 :(得分:1)

简而言之:您定义了一个models(带有s)属性,但它应该是 model (不带{ {1}}。

错误实际上已经解释了问题:

s

在您的ImproperlyConfigured at /events/1/edit/ EventUpdateView is missing a QuerySet. Define EventUpdateView.model, EventUpdateView.queryset, or override EventUpdateView.get_queryset().) 中,您没有指定 EventUpdateView 属性,而是编写了model,对于Django,这是完全不同的属性。因此,您应该将其重命名为:

models

对于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'来说,没关系,因为您还定义了EventListView属性,因此Django接受了该属性,但我还是会对其进行更新。

此外,在queryset中,您需要默认指定一个urls.py参数:

pk

最后,您在模板中写了类似的内容:

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

但是显然没有{% url 'event_update' event.id %} 标识符,因此eventevent.id(默认为空字符串),它不是整数(至少在您没有指定),因此找不到相关的网址。经过一番讨论,事实证明正确的标识符是string_if_invalid,所以正确的URL类似于:

object

当然,其他{% url 'event_update' pk=object.id %}调用也应如此。