簡體   English   中英

在基於Django類的視圖中避免重復

[英]Avoiding repetition in Django class-based view

我正在用Django編寫Web應用程序,該應用程序以特定方式使用。 它不是使用存儲在數據庫中的模型,而是使用REST API根據從另一個應用程序和平台收集的JSON數據動態構建表單。

該網頁呈現一個表單,其中顯示了數學參數及其值的列表。 然后,用戶可以更改(或不更改)這些值,然后按“運行”按鈕以顯示一些計算結果。

表單是根據通過URL查詢JSON數據而獲得的數據構建的(URL給了我參數列表及其初始值)。 根據規范,我必須使用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值丟失。

我需要獲取功能嗎? 還是我做錯了? 總的來說,有沒有更好的方法? 非常感謝您的建議。

基於類的視圖是專門為防止您將實例存儲在實例屬性中而設計的,因為它不是線程安全的。 數據將在所有請求之間共享。

在單獨的請求之間存儲數據的地方是會話

我要回到最初的問題。 我想知道最好的解決方案是使用AJAX嗎? 當用戶通過GET訪問頁面時,我會渲染一次表單,然后使用AJAX處理POST調用,這只會更新頁面的結果部分(圖形,表格),而無需再次渲染表單。 這聽起來合理嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM