私は特定の方法で使用される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機能が必要ですか?または私はそれを完全に間違っているのですか?一般的に、より良い方法がありますか?あなたの提案にお礼を申し上げます。
ありがとう、これは興味深い提案です。しかし、私がCBVではなくFBVを使用していたとしても、POSTの後でも動的フォームを再作成するのと同じ問題があります。結果を表示した後でも、フォームを再度表示して、ユーザーに同じインターフェースを与える必要があります(同じページからシミュレーションを再実行できるようにする)。ですから、たとえ私がview()関数でGETとPOSTのリクエストをテストしていたとしても、私は自分のインターフェースを構築するようにデータを要求しなければなりません。私は正しいですか?それとも、FBVを使って属性にデータを格納できるのですか? – Zebulon