我正在编写一个基本的“事件”应用程序,到目前为止,该应用程序包含两个模块(应用程序):用户和事件。
我正在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()。)
答案 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 %}
标识符,因此event
是event.id
(默认为空字符串),它不是整数(至少在您没有指定),因此找不到相关的网址。经过一番讨论,事实证明正确的标识符是string_if_invalid
,所以正确的URL类似于:
object
当然,其他{% url 'event_update' pk=object.id %}
调用也应如此。