Django模型选择字段-依赖于其他字段的choi

2024-05-13 04:01:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要有两个字段的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??

如果车辆类型设置为个人,如何将生成字段的选项设置为个人?我该怎么做?在模型级别上有可能吗?


Tags: django模型内容列表modelstypelengthmax
2条回答

可能不能,因为这取决于用户与表单的交互:在将表单发送到浏览器之前,服务器无法预先知道用户将选择哪个元素。您可能可以使用ajax实现这一点。我认为一个工作过程可以是:

  • 创建一个包含所有字段的表单,并使make字段hidden
  • 创建一个视图(我称之为AjaxMakeFieldView),该视图将捕获一个ajax请求,接受一个vehicle_type参数,并返回make field的HTML,其中填充了相关数据。在URLConf中为此视图添加一个URL。
  • 在模板中,添加Javascript绑定:当用户选择vehicle_type时,浏览器将向AjaxMakeFieldView发送aan ajax请求,并用返回的HTML替换隐藏的make字段

如果不需要javascript,另一种方法是两步式:

  • 具有vehicle_type字段的第一个窗体
  • 提交第一个表单后,用户将获得第二个表单,其中包含一个make字段,根据在第一个表单中选择的vehicle_type填充初始数据。

我从来没有这样做过,但是Django documentation on Form wizard似乎是一个很好的开始。

这就是为什么我在一个页面上有两个相互依赖的模型选择字段。在下面,field2取决于field1

Javascript部分

请注意,在$.each()中,不应该使用$.parseJSON(resp)(而不仅仅是json),因为jQuery已经对其进行了解析(由于内容类型为“application/json”响应)-请参见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框架也可以做到这一点。 我正在从我的MyModel2中获取fields=('id', 'code', 'affection'))-然后可以使用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')

相关问题 更多 >