Django:如何对从表单发布中获得的输入执行和显示计算?

时间:2019-03-16 17:13:30

标签: django django-forms

我已经使用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"),
]

1 个答案:

答案 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并进行计算,然后呈现结果。

希望这会有所帮助!