Python Django-使用常规视图找不到URL
到目前为止,我正在编写一个基本事件应用程序,其中包含两个模块(应用程序):用户和事件 我在Ubuntu 16.04上使用Django 2.1和Python 3.6 到目前为止,我已经能够处理用户,但在事件中,我不能使用更新、详细信息和删除通用视图。他们都返回404 My views.py:Python Django-使用常规视图找不到URL,python,django,django-urls,Python,Django,Django Urls,到目前为止,我正在编写一个基本事件应用程序,其中包含两个模块(应用程序):用户和事件 我在Ubuntu 16.04上使用Django 2.1和Python 3.6 到目前为止,我已经能够处理用户,但在事件中,我不能使用更新、详细信息和删除通用视图。他们都返回404 My views.py: class EventListView(ListView): model = EventModel template_name = 'event_list.html' queryse
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'
My URL.py(在项目文件夹中):
My urls.py(在事件应用程序中):
该项目的url.py与上面类似,只是它还有include和admin
给出404错误的URL示例:
http://127.0.0.1:8000/events/1/
http://127.0.0.1:8000/events/1/edit/
PS我以为编辑和删除会给我404,但实际上错误是:
在/events/1/edit处配置不当/
EventUpdateView缺少查询集。定义EventUpdateView.model、EventUpdateView.queryset或重写EventUpdateView.get_queryset()
简而言之:您定义了一个
模型
(带有s
)属性,但它应该是模型
(没有s
)
这个错误实际上已经解释了这个问题:
在您的EventUpdateView
中,您没有指定model
属性,而是编写了models
,对于Django,这是一个完全不同的属性。因此,您应该将其重命名为:
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'
最后,在模板中,您编写了如下内容:
{% url 'event_update' event.id %}
{% url 'event_update' pk=object.id %}
但是显然没有事件
标识符,因此event.id
是字符串(如果无效的话)
(默认为空字符串),它不是整数(如果没有指定,至少不是整数),因此它找不到相关的URL。经过讨论,正确的标识符是object
,因此正确的url类似于:
{% url 'event_update' event.id %}
{% url 'event_update' pk=object.id %}
{%url'事件\更新'pk=object.id%}
当然,其他
{%url…%}
调用也会发生同样的情况。您是否定义了应用程序名称空间
?请发布完整的url.py
文件,而不是“受限”版本。您打算如何使用它们?请添加提供404的URL示例。您确定要发出适当的POST
或DELETE
等请求吗?不GET
@IvanStarostin使用我的浏览器,我正在尝试访问它们。我还没有实现任何POST或GET。我使用的是上面这样的通用视图。至少它不应该是models=EventModel
它是model
属性。非型号>>S@IvanStarostin哇!修复了它,但仍然有相同的错误。编辑和删除时的错误现在更改为:必须使用URLconf中的对象pk或slug调用Generic detail view EventUpdateView。我想我正在用pk校准,但不知道django为什么没有检测到它。谢谢你的提示!事实上,Ivan提到了这一点,我修复了它,但我仍然在URL/events/1/中看到404link@aLuViAn:是的,这是因为第二个问题:您将参数命名为id
,而不是pk
。因此,要么更新get_object
函数,要么使用pk
。也解决了这个问题,谢谢!现在我的编辑和删除工作良好。但是我的事件还是得到了404/1/@aLuViAn:你确定存在一个具有给定id的事件吗?是的,我检查了数据库。糟糕的是,错误已改为NoReverseMatch…我认为它来自event\u detail.html
:
,这应该可以正常工作,因为我在event\u list.html中有完全相同的行,它可以正常工作
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 %}
{% url 'event_update' pk=object.id %}