2017-06-13 71 views
0

我在Django中编写了一个Web应用程序,它以特定方式使用。它不是使用存储在数据库中的模型,而是使用REST API从其他应用程序和平台收集的JSON数据动态构建表单。避免在Django基于类的视图中重复

网页呈现一个表单,其中显示数学参数及其值的列表。然后用户可以改变(或不改变)这些值,并按下“运行”按钮来显示一些计算结果。

表格是根据通过URL查询JSON数据(给出参数列表及其初始值)获得的数据构建的。根据规范,我必须使用Django并且不要使用数据库来存储任何参数值数据(唯一存储的数据是JSON数据的URL地址)。

我结束了一些工作解决方案,使用CBV。我有一个DetailedView,该结构的:

class SimulationView(DetailView): 
    template_name='template.html' 
    model=SimModel # provides URLs for REST API (URLs for querying parameter list and simulation function) 

    # this is used to display the page with GET 
    def get_context_data(self, **kwargs): 
     # conn.request function that returns param_JSON in JSON/REST 
     # for a SUBSET of parameters in param_JSON build a list of entries named init_entries. Note not all parameters from the JSON request are used for the user interface. 
     # form = paramForm(initial=init_entries) and store in context['form'] 
     return context 

    def post(self, request, *args, **kwargs): 
     # because the user may have changed parameter values, need to rebuild the JSON dataset to return to the URL with a simulation request 
     # conn.request function that returns param_list in JSON/REST 
     # for each param in JSON param_list build a list of entries 
     # form = paramForm(request.POST, request.FILES, initial=init_entries) and store in context['form'] 
     # use form data to build REST request for the simulation function 
     # conn.request simulation function and get result in JSON 
     # store result in context['result'] 
     return render(request, 'template.html', context) 

template.html是reponsible做GET时同时显示的初始形式,并做了POST当结果为好。

正如您所见,存在性能问题。当您执行GET来构建页面时,您必须执行REST连接来获取数据并构建窗体和界面(这是正常的)。但是,当您POST请求模拟时,您需要再次运行URL连接以获取JSON格式的参数列表,更改这些值,然后请求模拟结果。请注意,REST请求返回的参数比向用户显示的参数多得多,因此仅使用表单数据来构建适当的JSON请求是不可能的。这有效,但效率不高。我尝试将param_JSON存储在类的某个字段中,但这不起作用:执行POST时类再次被立即执行,并且param_JSON值丢失。

我需要一个get函数吗?或者我是否完全错误?一般来说,有没有更好的方法?非常感谢你的建议。

回答

0

基于类的视图专门设计用于防止您将事物存储在实例属性中,因为这不是线程安全的;数据将在所有请求之间共享。

在不同请求之间存储数据的地方是session

+0

谢谢,这是一个有趣的建议。问题是:如果我不使用CBV,但FBV,即使在POST之后,我也会有同样的问题重新创建我的动态表单?即使在显示结果之后,我也需要再次显示表单,以便为用户提供相同的界面(并允许他再次从同一页面运行模拟)。所以,即使我在view()函数中测试GET和POST的请求,我也不得不请求数据来构建我的界面。我对么?或者你的意思是说,使用FBV,你可以将数据存储在属性中? – Zebulon

0

我回到我原来的问题。我想知道最好的解决方案是使用AJAX吗?当用户通过GET访问页面时,我提交表单一次,然后用AJAX处理POST调用,AJAX仅更新页面(图表,表格)的结果部分而不再次显示表单。这听起来是合理的解决方案吗?