1

私は大規模なプロジェクトで 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 つのパターンに落ち着きたいと思います。

4

1 に答える 1

1

私は前者を主張します。テンプレートにはプレゼンテーションロジックのみを含める必要があり、オブジェクトをJSONにマーシャリングすることは、実際にはプレゼンテーションロジックの一部ではありません。

于 2012-12-10T14:40:48.087 に答える