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.id
是 string_if_invalid
(默认情况下为空字符串),它不是整数(至少如果您没有指定则不会),因此找不到相关的 URL。经过一番讨论,原来正确的标识符是object
,所以正确的url是这样的:
{% url 'event_update' pk=<b>object.id</b> %}
其他 {% url ... %}
调用当然也应该发生同样的情况。
我正在编写一个基本的事件应用程序,到目前为止它包含两个模块(应用程序):用户和事件。
我在 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.id
是 string_if_invalid
(默认情况下为空字符串),它不是整数(至少如果您没有指定则不会),因此找不到相关的 URL。经过一番讨论,原来正确的标识符是object
,所以正确的url是这样的:
{% url 'event_update' pk=<b>object.id</b> %}
其他 {% url ... %}
调用当然也应该发生同样的情况。