PHP Laravel NGINX html css Bootstrap Python Symfony Apache Windows linux jquery Django ASP vanilla Slim vagrant docker Homestead MySQL Redis Git SVN ssh Root vim PhpStorm Pycharm sass less PHP Laravel android html css Vue Angular React NGINX html css Javascript

Django "AttributeError: Generic detail view Update must be called with either an object pk or a slug." 错误的解决方法

原创

原创不易 ~ 转载请注明出处哦

Django中,我们如果使用了Class-based Genric Views,那么在创建View的时候,Django会为我们自动创建相应的ModelForms,省去了我们很多冗余的代码。

在使用UpdateView的时候,我们需要给这个View传递一个id参数,这样Django才知道我们需要更新的对象的id。但是需要注意,默认情况下,Django会寻找pkslugkey的参数,而如果没有这样的参数存在,那么Django就会抱怨以下错误:

AttributeError: Generic detail view Update must be called with either an object pk or a slug.

Django文档中写道:

slug_url_kwarg
The name of the URLConf keyword argument that contains the slug. By default, slug_url_kwarg is 'slug'.

pk_url_kwarg
The name of the URLConf keyword argument that contains the primary key. By default, pk_url_kwarg is 'pk'.

所以,如果想要变更URLConf中的默认参数名字,我们需要在UpdateView中,修改slug_url_kwargpk_url_kwarg

from django.views.generic import UpdateView  
  
class CourseUpdate(UpdateView):  
    model = Course  
    fields = ['code', 'title', 'description', 'hours', 'semester', 'subject']  
    pk_url_kwarg = 'course_id'

urls.py中,我们也需要使用相应的名称:

urlpatters = [  
    path('<int:course_id>/', course.Update.as_view(), name='courses.update'),  
]

这样Django就满意不会继续抱怨了:)


正在加载验证码......
请先完成验证