Python Django-使用常规视图找不到URL

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

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

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

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

My 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'
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 %}