如何使用Django中的按钮删除

时间:2014-08-21 20:41:23

标签: django django-class-based-views

我有一个项目列表。我正在使用ListView显示它们。列表中的每个项目都在可折叠块中。我想在可折叠块中放置两个按钮,一个用于编辑项目,第二个用于删除:

<a class='btn btn-success' style = 'float:left;' href="/scale/{{scale.pk}}/">Edit Scale</a>
<a class='btn btn-danger' style = 'float:right;' href="/scales" name="delete_btn">Delete Scale</a>

编辑按钮没问题。单击它时,它将转到另一个页面,该页面具有不同的模板和views.py中的不同类(扩展到UpdateView)。

但我无法弄清楚如何使用删除按钮删除对象。 当我点击删除按钮时,我不想转到另一个页面,因此我不需要单独的模板。

我试图将我的课程扩展到DeletionMixin:

class ScaleListView(DeletionMixin, ListView):
    context_object_name = 'Scales'
    model = Scale
    success_url = reverse_lazy('scale_list')

    def post(self, *args, **kwargs):
        print 'post in scale list'
        return DeletionMixin.post(self, *args, **kwargs)           

    def get_context_data(self, **kwargs):
        print 'get_context_data in ScaleListView'
        context = super(ScaleListView, self).get_context_data(**kwargs)
        context['header_name'] = 'Scale list'
        return context

我试图覆盖Deletionmixin的post和delete方法,但我真的不知道如何将删除按钮关联到这里。

我读了this page,警告说,并非所有mixins和基于类的视图都可以一起使用。但我认为问题不在这里。

有人可以解释如何使这项工作吗?

1 个答案:

答案 0 :(得分:1)

有几个问题。

首先,post()中的return语句正在创建一个单独的DeletionMixin实例,这意味着它将无法引用ScaleListView实例的任何字段或方法。你需要这样的东西:

return super(ScaleListView, self).post(request, *args, **kwargs)

但这不能解决你的问题。 DeletionMixin调用get_object(),ListView或它的任何父类都没有实现。 DeletionMixin假设您一次只会删除一个对象(这听起来像是您尝试做的事情)。尝试使用DetailView而不是ListView,看看它能带给你什么。

(为什么DetailView,当你使用列表时?因为你不希望视图对整个列表做任何事情。你只是处理一个单独的记录(即&和#34; detail&#34;),这就是为什么这更有意义。)