2013-07-16 36 views
10

将“取消”按钮添加到Django中的基于类的通用视图的最佳方式是什么?如何在django中添加取消按钮到DeleteView

在下面的例子中,我想取消按钮带你到success_url而不删除对象。我曾尝试将一个按钮<input type="submit" name="cancel" value="Cancel" />添加到模板。我可以通过覆盖AuthorDelete类的post方法来检测这个按钮是否被按下,但是我无法确定如何从那里重定向。

实施例的myapp/views.py:

from django.views.generic.edit import DeleteView 
from django.core.urlresolvers import reverse_lazy 
from myapp.models import Author 

class AuthorDelete(DeleteView): 
    model = Author 
    success_url = reverse_lazy('author-list') 

    def post(self, request, *args, **kwargs): 
     if request.POST["cancel"]: 
      return ### return what? Can I redirect from here? 
     else: 
      return super(AuthorDelete, self).post(request, *args, **kwargs) 

实施例的myapp/author_confirm_delete.html:

<form action="" method="post">{% csrf_token %} 
    <p>Are you sure you want to delete "{{ object }}"?</p> 
    <input type="submit" value="Confirm" /> 
    <input type="submit" name="cancel" value="Cancel" /> 
</form> 

(改编自docs实施例)

回答

11

你重写post方法的方法并检查是否按下取消按钮是好的。您可以通过返回HttpResponseRedirect实例来重定向。

from django.http import HttpResponseRedirect 

class AuthorDelete(DeleteView): 
    model = Author 
    success_url = reverse_lazy('author-list') 

    def post(self, request, *args, **kwargs): 
     if "cancel" in request.POST: 
      url = self.get_success_url() 
      return HttpResponseRedirect(url) 
     else: 
      return super(AuthorDelete, self).post(request, *args, **kwargs) 

我用get_success_url()是通用的,它的默认实现是返回self.success_url

10

为什么不简单地把success_url的“取消”链接,而不是一个按钮?你总是可以用CSS来设计它,使它看起来像一个按钮。

这具有不使用POST表单进行简单重定向的优点,它可能会混淆搜索引擎并中断Web模型。另外,您不需要修改Python代码。

+0

这些都是这种方法的好理由。但要做到这一点,我不得不将success_url添加到模板上下文中,所以我仍然需要修改python代码。 –

+2

@MichaelDunn其实你可以通过{{view.success_url}}来访问url地址,所以不应该有额外的python代码 – MatheusJardimB

1

如果使用CBV的,你可以直接从模板访问view

<a href="{{ view.get_success_url }}" class="btn btn-default">Cancel</a> 

注意:您要访问它通过吸气的情况下,它已被继承。

这在所有基于类的通用视图ContextMixin docs

模板背景注意到包括view 变量指向视图实例。

相关问题