用于单个视图的模态窗口中的多个django表单

时间:2017-12-09 17:51:02

标签: django twitter-bootstrap

我正在开发简单的费用跟踪应用。您可以在下面找到包含所有用户操作(费用或收入)的视图:

enter image description here

基于this thread我实现了bootstrap模式窗口以显示新的操作形式:

enter image description here

您可以在下面找到负责显示上述视图的ManageOperations视图:

class ManageOperations(ListView, FormView, OperationMixIn):

    model = Operation
    form_class = OperationForm
    template_name = "expenses/manage_operations.html"
    success_url = reverse_lazy('manage_operations')

    def get_context_data(self, **kwargs):
        context = super(ManageOperations, self).get_context_data(**kwargs)
        context['operations_list'] = Operation.objects.filter(user=self.request.user).order_by('-date')
        return context

    def get_form_kwargs(self):
        kwargs = super(ManageOperations, self).get_form_kwargs()
        kwargs.update(user=self.request.user,
                      initial={'account': Account.objects.get(user=self.request.user, default=True)})
        return kwargs

    def form_valid(self, form):
        operation = form.save(commit=False)
        operation.currency = Account.objects.get(pk=form.instance.account_id).currency
        self.update_account_balance(form)
        form.instance.user = self.request.user
        form.save()
        return super(ManageOperations, self).form_valid(form)

我想为"编辑"同时实现相同的模态窗口。和"删除"动作。我假设它对OperationDelete视图来说非常简单:

class OperationDelete(DeleteView, OperationMixIn):

    model = Operation
    success_url = reverse_lazy('manage_operations')

    def delete(self, *args, **kwargs):
        self.restore_account_balance(self.get_object().pk)
        return super(OperationDelete, self).delete(*args, **kwargs)

我可以将delete方法移至我的ManageOperations视图,并将其从DeleteView继承。

在编辑现有操作时,事情变得越来越复杂。目前,以下代码负责处理现有条目的更新:

class OperationUpdate(UpdateView, OperationMixIn):

    model = Operation
    form_class = OperationForm
    success_url = reverse_lazy('manage_operations')

    def get_form_kwargs(self):
        kwargs = super(OperationUpdate, self).get_form_kwargs()
        kwargs.update({'user': self.request.user})
        return kwargs

    def form_valid(self, form):
        self.restore_account_balance(self.get_object().pk)
        self.update_account_balance(form)
        form.instance.user = self.request.user
        return super(OperationUpdate, self).form_valid(form)

如果我厌倦了将其合并到ManageOperations视图中,我将不得不处理get_form_kwargsform_valid方法的多种实现。

请您告诉我,如果我朝这个方向前进,或者有更好,更优雅的方法来解决我的问题?创建一个负责所有操作相关操作的大ManageOperations视图对我来说似乎有些愚蠢。

1 个答案:

答案 0 :(得分:0)

我相信你的方法很好,除了我会改为UpdateViewDeleteView AJAX视图:让他们返回JSON而不是HTML模板,并使用模板中的AJAX调用它们。

  • 按原样保留ManageOperations
  • 在您的编辑模式表单中,让AJAX使用表单数据将其发布到您的OperationUpdate视图。
  • 更改OperationUpdate视图以返回JSON响应。您可以一直使用Django REST Framework,但是很容易调整现有的Django泛型CBV来返回JSON:覆盖render_to_response()(对于表单无效的情况)和{ {1}}方法。您只需返回绑定的表单字段(值)和JSON中的错误。如果表单有效,则返回JSON中保存的对象,以便javascript可以更新表中的相应值。
  • form_valid()视图更改为还返回JSON响应。
  • 在Javascript中添加JSON响应的处理,以显示表单错误,关闭模式,更新表中的值等等。