我已经使用ModelForm和FormView成功创建了一个包含许多字段的复杂表单。我设法保存了这些数据并将其显示在管理员中。因此,这仅仅是我想做的开始。
我的下一个目标是使用用户通过表单发布的输入来执行计算,然后在另一个视图中显示这些计算的结果。
这样做的最佳方法是什么?到目前为止,这是我的文件(由于不相关,因此我不显示所有字段)
这是我用来显示表单的视图
class SimulInputView(FormView):
form_class = SimulInputForm
template_name = 'apps/simulateur/formulaire/form.html'
success_url = reverse_lazy('simulateur_results')
def get_initial(self):
initial_data = super(SimulInputView, self).get_initial()
for key, value in dict_simul_form_default_data.items():
initial_data[key] = value
return initial_data
def get_context_data(self,**kwargs):
context = super().get_context_data(**kwargs)
context['data'] = SimulateurData
return context
def form_valid(self, form):
form.instance.user = self.request.user
form.save()
return super().form_valid(form)
我应该如何修改form_valid函数以使用另一个模块,该模块将在收到的表单数据显示在另一个视图中之前对其进行计算?
编辑
我修改了我的代码,如下所示。看来效果不错,但我想知道以这种方式进行处理是否是一个好习惯。您能分享您的意见吗?
# VIEWS
class SimulInputView(FormView):
form_class = SimulInputForm
template_name = 'apps/simulateur/simulateur_form.html'
success_url = reverse_lazy('home')
def form_valid(self, form):
# save form and put in data_instance to get its id later
data_instance = form.save()
# save form data
form_data = form.data
# call calculs_simulation.py script which performs calculations on form data
result = calculs_simulation(form_data)
# put results of calculation in SimulResult model, and set the id for SimulInput foreignkey
result_model = SimulResult(simulinput_id=data_instance.id, **result)
# save the result model and get its id
result_model.save()
result_model_id = result_model.id
return redirect('simulateur_results', result_model_id)
class SimulResultView(DetailView):
model = SimulResult
template_name = 'apps/simulateur/simulateur_results.html'
# URLS
urlpatterns = [
path('formulaire/', simul_input_views.SimulInputView.as_view(), name="simulateur_form"),
path('resultats/<int:pk>/', simul_result_views.SimulResultView.as_view(), name="simulateur_results"),
]
答案 0 :(得分:0)
您可以返回另一个视图,并保存数据的状态以显示所需的结果。例如,
def form_valid(self, form):
.
.
data_instance = form.save()
return redirect(reverse('results_view', args=(data_instance.id, )))
现在,在您的results_view中,您可以通过id获取data_instance并进行计算,然后呈现结果。
希望这会有所帮助!