'UpdateView' 对象没有属性 'object'

use*_*174 2 python django django-views

所以我一直在尝试向我一直在使用的 UpdateView 添加一个取消按钮。这是我的代码:

视图.py:

class CountryEditView(generic.edit.UpdateView):
    model = Country
    fields = ['name']
    template_name_suffix = '_edit'  

    def post(self, request, *args, **kwargs):
        if "cancel" in request.POST:
            url = self.object.get_absolute_url()
            return HttpResponseRedirect(url)
        else:
            return super(CountryEditView, self).post(request, *args, **kwargs)
# etc....
Run Code Online (Sandbox Code Playgroud)

模型.py:

class Country(AutoUpdateModel): #A subclass of models.Model
    def get_absolute_url(self):
        return reverse('appName:country_info', args=(self.id,))
    #etc...
Run Code Online (Sandbox Code Playgroud)

country_edit.html:

<form action="" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Update" />
    <input type="submit" name="cancel" value="Cancel" />
</form>
Run Code Online (Sandbox Code Playgroud)

但是我一直收到这个错误:

Traceback (most recent call last):
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\site-packages\django\core\handlers\exception.py", line 42, in inner
    response = get_response(request)
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\site-packages\django\views\generic\base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\site-packages\django\views\generic\base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "C:\Users\username\Envs\projName\appName\views.py", line 38, in post

    url = self.object.get_success_url()
AttributeError: 'CountryEditView' object has no attribute 'object'
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义,因为文档页面When using UpdateView you have access to self.object, which is the object being updated.我做错了什么吗?

Jen*_*rup 6

你这样做,但你覆盖了post(),这object是分配的地方。所以需要自己调用方法直接获取:

class CountryEditView(generic.edit.UpdateView):
    model = Country
    fields = ['name']
    template_name_suffix = '_edit'  

    def post(self, request, *args, **kwargs):
        if "cancel" in request.POST:
            object = self.get_object()
            url = object.get_absolute_url()
            return HttpResponseRedirect(url)
        else:
            return super(CountryEditView, self).post(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

您应该查看CCBV - 您可以很容易地看到每种方法在做什么。

旁注:

1)redirect如果它已经get_absolute_url定义,你可以只传递一个对象:

def post(self, request, *args, **kwargs):
    if "cancel" in request.POST:
        object = self.get_object()
        return redirect(object)
Run Code Online (Sandbox Code Playgroud)