我正在开发简单的费用跟踪应用。您可以在下面找到包含所有用户操作(费用或收入)的视图:
基于this thread我实现了bootstrap模式窗口以显示新的操作形式:
您可以在下面找到负责显示上述视图的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_kwargs
和form_valid
方法的多种实现。
请您告诉我,如果我朝这个方向前进,或者有更好,更优雅的方法来解决我的问题?创建一个负责所有操作相关操作的大ManageOperations
视图对我来说似乎有些愚蠢。
答案 0 :(得分:0)
我相信你的方法很好,除了我会改为UpdateView
和DeleteView
AJAX视图:让他们返回JSON而不是HTML模板,并使用模板中的AJAX调用它们。
ManageOperations
OperationUpdate
视图。OperationUpdate
视图以返回JSON响应。您可以一直使用Django REST Framework,但是很容易调整现有的Django泛型CBV来返回JSON:覆盖render_to_response()
(对于表单无效的情况)和{ {1}}方法。您只需返回绑定的表单字段(值)和JSON中的错误。如果表单有效,则返回JSON中保存的对象,以便javascript可以更新表中的相应值。form_valid()
视图更改为还返回JSON响应。