我需要带有2个字段的django modelform,其中第二个字段选择列表取决于在第一个字段中选择的内容。我的模特:
class Offer(BaseModel):
VEHICLE_TYPES = (
('personal','Personal car'),
('truck','Truck'),
)
vehicle_type = models.CharField(max_length=32, choices=VEHICLE_TYPES, default='personal', verbose_name='Vehicle type')
PERSONAL_MAKES = (
('',''),
)
TRUCK_MAKES = (
('',''),
)
make = models.CharField(max_length=32)#what more??
如果vehicle_type设置为 personal ,如何将 make 字段的选项设置为 PERSONAL_MAKES ?我怎样才能做到这一点?是否可以在模型级别上使用?
答案 0 :(得分:5)
您可能不能,因为它取决于用户与您的表单的交互:您的服务器无法提前知道您的用户在将表单发送到浏览器之前将选择哪个元素。您可以使用ajax实现此目的。我认为一个工作过程可能是:
make
字段hidden AjaxMakeFieldView
),它将捕获带有vehicle_type
参数的ajax请求,并返回make field
的HTML,并填充相关数据。在URLConf中为此视图添加URL。vehicle_type
时,浏览器会向AjaxMakeFieldView
发送ajax请求,并使用返回的HTML替换隐藏的make
字段如果你不想要javascript,另一种方式是两步形式:
vehicle_type
字段make
字段,根据第一个表单中选择的vehicle_type
填充初始数据。我从来没有这样做,但Django documentation on Form wizard似乎是一个很好的起点。
答案 1 :(得分:0)
这就是我在一个页面上最终有两个模型选择字段相互依赖的方式。在下面,field2
取决于field1
:
Javascript部分
请注意,在$.each()
中,不应使用$.parseJSON(resp)
(而不仅仅是json
),因为我们已经通过jQuery解析了它(由于content_type =& #39; application / json' response) - 见I keep getting "Uncaught SyntaxError: Unexpected token o"。
$(document).ready(function() {
$("#id_field2").empty();
$("#id_field1").change(function(){
$.ajax({
url: "{% url 'ajax_get_field_2' %}",
type: 'GET',
data: {field1_id: $("#id_field1").val()},
dataType: "json",
success: function(resp){
$("#id_field2").empty();
$.each(resp, function(idx, obj) {
$('#id_field2').append($('<option></option>').attr('value', obj.pk).text(obj.fields.code + ' (' + obj.fields.affection + ')'));
});
},
error: function(jqXHR, textStatus, errorThrown) {
alert(errorThrown);
}
});
});
});
Django views.py部分
请注意,这也可以通过django-rest-framework完成。
我从fields=('id', 'code', 'affection'))
获取MyModel2
- 然后可以使用obj.fielsd.<myfieldname>
在JQuery中访问这些内容。
class AjaxField2View(generic.View):
def get(self, request, *args, **kwargs):
field_1 = get_object_or_404(MyModel1, pk=request.GET.get('field1_id', ''))
model2_results = MyModel2.objects.filter(k_value=field_1 .k_value)
return HttpResponse(serializers.serialize('json', model2_results, fields=('id', 'code', 'affection')), content_type='application/json')
答案 2 :(得分:0)
另一种智能方法查询/免费,无需查看,
是为与字段A选项相关的选项制作html标签。
例如,在字段 B 选项中:
<option example_tag="example_value" value="5"></option>
此标签应与字段 A 值或文本相关。
使用 JS 相应地使用此选项标签显示块/无。
并且不要忘记每次用户更改字段 A 时重置值。