2017-06-13 12 views
0

私は特定の方法で使用されるWebアプリケーションをDjangoで作成しています。データベースに格納されたモデルを使用する代わりに、REST APIを使用して別のアプリケーションおよびプラットフォームから収集されたJSONデータから動的にフォームを構築します。Djangoのクラスベースのビューでの反復の回避

ウェブページは、数学的パラメータとその値のリストを表示するフォームをレンダリングします。ユーザーはこれらの値を変更(または変更)することができ、「実行」ボタンを押して計算結果を表示することができます。

フォームは、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をやったときに、最初のフォームの両方を表示するreponsibleあり、そして同様の結果POSTをやって:私はその構造上、DetailedViewを持っています。

ご覧のとおり、パフォーマンス上の問題があります。ページを構築するために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を介してページにアクセスしたときにフォームを一度レンダリングし、POSTコールはAJAXで処理されます.AJAXは、フォームを再描画せずにページ(グラフ、表)の結果部分のみを更新します。それは合理的な解決策と聞こえますか?

関連する問題