私は大規模なプロジェクトで Django を使用しており、一般的な状況に最適なパターンを決定するのに苦労しています。たとえば、Django モデルがあり、HTML でモデルの 1 つのフィールドを SELECT 要素で使用する必要があり、その要素から選択が行われると、モデルから別の値を INPUT フィールドに自動入力する必要があります。 Jクエリ。
次のようなDjangoモデル、HTMLテンプレート、およびJavascriptがあります。
models.py
class StockSignoutMessage(models.Model):
msg_name = models.CharField(max_length=32)
msg_text = models.CharField(max_length=255, blank=True)
signout.html
<select name="stock_msgs" id="stock_msgs">
{% for msg in all_stock_signout_msgs %}
<option value="{{ msg.pk }}">{{ msg.msg_name }}</option>
{% endfor %}
</select>
<input type="text" size="50" name="comment" id="comment" />
signout.js
$(document).ready(function() {
$("#stock_msgs").click(stock_msg_builder);
});
stock_msg_builder = function() {
var outfield = $("#comment");
var selected_msg_index = $("#stock_msgs").val();
var add_msg = stock_msgs[selected_msg_index];
outfield.val(outfield.val() + add_msg );
outfield.focus();
}
私の HTML では、SELECT 要素で msg_name を使用する必要があり、その要素から選択が行われるときに、その値を使用して、JQuery を介して INPUT フィールドに msg_text を追加する必要があります。
私はこれをいくつかの異なる方法で試しました:
(1) モデルだけをテンプレートに渡し、テンプレートに SELECT および Javascript オブジェクトを作成します。
ビュー.py
all_stock_signout_msgs = StockSignoutMessage.objects.all()
return render_to_response("signout.html",
{'all_stock_signout_msgs': all_stock_signout_msgs,},
context_instance=RequestContext(request))
signout.html
<script type="text/javascript">
var stock_msgs = [];
{% for msg in all_stock_signout_msgs %}
stock_msgs[{{ msg.pk }}] = "{{ msg.msg_text }}";
{% endfor %}
</script>
(2) SELECT の作成に使用するモデルを渡し、モデルの JSON バージョンも渡して Javascript オブジェクトを作成します。
ビュー.py
all_stock_signout_msgs = StockSignoutMessage.objects.all()
json_stock_signout_msgs = serializers.serialize("json", all_stock_signout_msgs)
return render_to_response("signout.html",
{'all_stock_signout_msgs': all_stock_signout_msgs,
'json_stock_signout_msgs': json_stock_Signout_msgs,},
context_instance=RequestContext(request))
signout.html
var stock_msgs = "{{ json_stock_signout_msgs }}";
signout.js
$(document).ready(function() {
$("#stock_msgs").click(stock_msg_builder);
});
stock_msg_builder = function() {
var outfield = $("#comment");
var selected_msg_index = $("#stock_msgs").val();
var add_msg = stock_msgs[selected_msg_index];
outfield.val(outfield.val() + add_msg );
outfield.focus();
}
したがって、テンプレートに渡すデータを減らしてフォーマットするためのテンプレートのコードを増やすか、同じデータを異なる形式で複数回渡すが、より多くの Javascript を使用して処理する方がよいでしょうか。これは単純なモデルですが、私のプロジェクトの他の部分はもっと複雑なので、これらのユース ケースの 1 つのパターンに落ち着きたいと思います。