1

我在一个大型项目中使用 Django,并且正在努力确定常见情况的最佳模式。例如,我有一个 Django 模型,在我的 HTML 中,我需要在 SELECT 元素中使用模型的一个字段,当从该元素中进行选择时,我需要通过在 INPUT 字段中从模型中自动填充另一个值查询。

我有一个 Django 模型、HTML 模板和 Javascript,例如:

模型.py

class StockSignoutMessage(models.Model):  
    msg_name = models.CharField(max_length=32)  
    msg_text = models.CharField(max_length=255, blank=True)

签出.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" />

签出.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 将 msg_text 添加到 INPUT 字段中。

我尝试了几种不同的方法:

(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))

签出.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)) 

签出.html

var stock_msgs = "{{ json_stock_signout_msgs }}";

签出.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 来处理它更好。这是一个简单的模型,但我项目的其他部分要复杂得多,所以我想为这些用例确定一个模式。

4

1 回答 1

1

我会争论前者。模板应该只在其中包含表示逻辑,并且将对象编组为 JSON 并不是表示逻辑的一部分。

于 2012-12-10T14:40:48.087 回答