2017-03-18 6 views
1

私は使用していたUpdateViewにキャンセルボタンを追加しようとしています。ここではそれのために私のコードです:'UpdateView'オブジェクトには属性 'object'がありません

views.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.... 

models.py:

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

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> 

は、しかし、私はこれを取得してきましたエラー:

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' 

documentation pageWhen using UpdateView you have access to self.object, which is the object being updated.と表示されていますので、間違っていることはありますか?

答えて

3

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) 

あなたはCCBVをチェックアウトする必要があります - あなたはそれぞれの方法は非常に簡単にやっているかを見ることができます。

サイドノート:

1)それはget_absolute_urlが定義されている場合は、ちょうどredirectにオブジェクトを渡すことができます。

def post(self, request, *args, **kwargs): 
    if "cancel" in request.POST: 
     object = self.get_object() 
     return redirect(object) 
+0

なぜ二度 'POST'を定義しますか? – user2361174

+0

うわー - それがどうなったかわからない - それを編集する –

関連する問題