gpt4 book ai didi

python - Django - 使用通用 View 找不到 URL

转载 作者:行者123 更新时间:2023-12-01 09:07:39 25 4
gpt4 key购买 nike

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

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

到目前为止,我已经能够处理用户,但在事件中,我无法使用更新、详细信息和删除通用 View 。它们都返回 404。

我的观点.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().)

最佳答案

简而言之:您定义了 model<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 ... %}上。来电。

关于python - Django - 使用通用 View 找不到 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51917397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com