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