繁体   English   中英

Django 模型选择字段 - 取决于其他字段的选择

[英]Django model choice field - depend on other field's choice

我需要带有 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 设置为个人,如何将make字段的选择设置为PERSONAL_MAKES 我怎样才能做到这一点? 在模型级别上可以吗?

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

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

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

  • 带有vehicle_type字段的第一个表单
  • 提交第一个表单后,您的用户将获得带有make字段的第二个表单,根据第一个表单中选择的vehicle_type填充初始数据。

我从来没有这样做过,但是关于表单向导的 Django 文档似乎是一个很好的起点。

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

Javascript 部分

请注意,在$.each() ,不应使用$.parseJSON(resp) (而不仅仅是json ),因为我们已经通过 jQuery 解析了它(由于 content_type='application/json' 响应) - 请参阅我不断收到 "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 来完成。 我正在从MyModel2获取fields=('id', 'code', 'affection')) - 然后可以使用obj.fielsd.<myfieldname>在 JQuery 中obj.fielsd.<myfieldname>这些obj.fielsd.<myfieldname>

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

另一种智能方法查询/免费,不需要视图

是为与字段 A 选择相关的选项制作 html 标签。

例如,在字段 B 选项中:

<option example_tag="example_value" value="5"></option>

此标记应与字段 A 值或文本相关。

使用 JS 相应地使用此选项标签显示块/无。

并且不要忘记每次用户更改字段 A 时重置值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM