我正在Django中编写一个Web应用程序,它以特定的方式使用。它不是使用存储在数据库中的模型,而是使用REST API从另一个应用程序和平台收集的JSON数据动态构建表单。
网页呈现一个表单,该表单显示数学参数及其值的列表。然后,用户可以更改(或不更改)这些值,然后按"运行"按钮显示一些计算结果。
表单是根据通过URL查询JSON数据获得的数据构建的(它给出了参数列表及其初始值)。根据规范,我必须使用Django并且不使用数据库来存储任何参数值数据(唯一存储的数据是JSON数据的URL地址)。
我最终得到了一些使用CBV的解决方案。我有一个结构的详细视图:
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可以在执行GET时显示初始表单,在执行POST时也显示结果。
如您所见,存在性能问题。当您进行GET构建页面时,您必须执行REST连接以获取数据并构建表单和接口(这是正常的)。但是当你POST请求模拟时,你需要再次运行URL连接以获得JSON格式的参数列表,更改值,然后请求模拟结果。请注意,REST请求返回的参数多于显示给用户的参数,因此不能仅使用表单数据来构建正确的JSON请求。这有效,但效率低下。我试图将param_JSON存储在类的一个字段中,但这不起作用:在执行POST时,类会再次实例化,并且param_JSON值会丢失。
我需要一个get函数吗?或者我完全错了吗?总的来说,还有更好的方法吗?非常感谢您的建议。
答案 0 :(得分:0)
基于类的视图专门用于防止您将事物存储在实例属性中,因为这不是线程安全的;数据将在所有请求之间共享。
在不同请求之间存储数据的地方是session。
答案 1 :(得分:0)
我将回到原来的问题。我想知道最好的解决方案是使用AJAX吗?当用户通过GET访问页面时,我会渲染一次表单,然后使用AJAX处理POST调用,AJAX只更新页面的结果部分(图形,表格)而不再渲染表单。这听起来是合理的解决方案吗?