Django/jQuery 级联选择框?

2024-02-26

我想构建一个国家/州选择器。首先,您选择一个国家/地区,该国家/地区的州/省/自治区/直辖市/自治区将显示在第二个选择框中。在 PHP 和 jQuery 中做到这一点相当容易,但我发现 Django 表单在这个意义上有点限制。

我可以在页面加载时将“状态”字段设置为空,然后用一些 jQuery 填充它,但是如果存在表单错误,它将无法“记住”您选择的状态。我也非常确定它会抛出验证错误,因为您的选择不是 Python 方面表单中列出的选项之一。

那么我该如何解决这些问题呢?


这是我的解决方案。它使用未记录的 Form 方法 _raw_value() 来查看请求的数据。这适用于也有前缀的表单。

class CascadeForm(forms.Form):
    parent=forms.ModelChoiceField(Parent.objects.all())
    child=forms.ModelChoiceField(Child.objects.none())

    def __init__(self, *args, **kwargs):
        forms.Form.__init__(self, *args, **kwargs)
        parents=Parent.objects.all()
        if len(parents)==1:
            self.fields['parent'].initial=parents[0].pk

        parent_id=self.fields['parent'].initial or self.initial.get('parent') \
                  or self._raw_value('parent')
        if parent_id:
            # parent is known. Now I can display the matching children.
            children=Child.objects.filter(parent__id=parent_id)
            self.fields['children'].queryset=children
            if len(children)==1:
                self.fields['children'].initial=children[0].pk

jquery代码:

function json_to_select(url, select_selector) {
/*
 Fill a select input field with data from a getJSON call
 Inspired by: http://stackoverflow.com/questions/1388302/create-option-on-the-fly-with-jquery
*/
    $.getJSON(url, function(data) {
    var opt=$(select_selector);
    var old_val=opt.val();
        opt.html('');
        $.each(data, function () {
            opt.append($('<option/>').val(this.id).text(this.value));
        });
        opt.val(old_val);
        opt.change();
    })
}


   $(function(){
     $('#id_parent').change(function(){
       json_to_select('PATH_TO/parent-to-children/?parent=' + $(this).val(), '#id_child');
     })  
    });

回调代码,返回JSON:

def parent_to_children(request):
    parent=request.GET.get('parent')
    ret=[]
    if parent:
        for children in Child.objects.filter(parent__id=parent):
            ret.append(dict(id=child.id, value=unicode(child)))
    if len(ret)!=1:
        ret.insert(0, dict(id='', value='---'))
    return django.http.HttpResponse(simplejson.dumps(ret), 
              content_type='application/json')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django/jQuery 级联选择框? 的相关文章

随机推荐

  • 如何在 Node.js 中根据 XML 验证 DTD

    如何根据 Node js 中的特定 XML 验证 DTD 我有一个端点 其中包含每个 XML 负载的 DTD 但试图找到一个可以使用 Node 进行模式验证的良好解决方案 这是一篇旧文章 但现在我们可以这样做节点Libxml https w
  • System.BadImageFormatException:无法加载文件或程序集[重复]

    这个问题在这里已经有答案了 C Windows Microsoft NET Framework64 v4 0 30319 gt InstallUtil exe C PRODUKCIJA D ebug DynamicHtmlTool exe
  • 将 WasapiLoopbackCapture wav 音频流转换为 MP3 文件

    我能够在 WasapiLoopbackCapture naudio 的帮助下捕获由扬声器生成的系统音频 但问题是它捕获 wav 文件并且 wav 文件的大小非常大 几乎 10 到 15 MB 分钟 我必须捕获 2 3 小时的音频 这太长了
  • 我不应该将接口作为 const 传递吗?

    我最近 又 遇到了将接口传递为时的 Delphi 编译器代码生成错误const https stackoverflow com a 7640979 12597泄漏参考 如果您的方法被声明为传递接口变量 则会发生这种情况const e g p
  • 链接的属性 target="_newtab"

    什么是 newtab 中的目标属性值HTML a 标签 我找不到有关浏览器兼容性的信息 它适用于所有现代浏览器吗 如果在浏览器选项中用户设置为在新窗口而不是在新选项卡中打开链接 它将如何工作 这个值是否在任何地方描述过HTML标准 你确定
  • 使用 pyplot.imshow 时禁用 MatPlotLib 警告

    第一次来这里 当我使用时 我收到以下警告pyplot imshow功能 使用 RGB 数据将输入数据裁剪到 imshow 的有效范围 浮点数为 0 1 整数为 0 255 根据我的数据 我知道这是完全预期的行为 如何关闭此警告 我努力了 i
  • 在字符串列表中搜索字符串的有效方法?

    我有一个字符串列表 需要查找哪些字符串与给定的输入值匹配 对我来说 存储此字符串列表并能够搜索它的最有效方法 内存与执行速度 是什么 字符串列表的启动和加载并不重要 但搜索的响应时间很重要 我应该使用 List 或 HashSet 还是只是
  • 使用 python 启动通过 chcp 65001 预先激活的控制台窗口

    我使用 python 库将 Unicode 字符打印到 Windows 控制台 如果我调用库中打印出 Unicode 字符的函数 它将引发异常 charmap codec can t encode characters 这就是我试图解决该错
  • ModuleNotFoundError:没有名为“flask”的模块

    阅读完这篇文章的标题后 不要尝试先复制 因为这里的内容可能会以不同的方式被问到 顺便说一句 我对 python 很陌生 现在为了工作需要开始学习 这是我的依赖项 virtualenv version gt 15 0 2 pip versio
  • “Message”:“此请求的授权已被拒绝。” OWIN中间件

    我将基于令牌的身份验证添加到我的 OWIN 中间件中 并且可以生成令牌 但在使用具有授权属性的 API 调用的令牌时 我总是收到 此请求的授权已被拒绝 尽管没有 Authorize 属性 但它工作正常 这是我的startup cs 和控制器
  • iOS,通过代码锁定设备

    出于测试目的 制作本地通知的屏幕截图 我需要能够从代码 测试代码或应用程序代码 锁定设备 模拟器 我从这里查看了几个答案 GSEventLockDevice 但它们很旧并且不适合我 XCUIDevice 中有一个私有方法 因此您可以使用它锁
  • Three.js - 如何检查对象是否位于球体后面(不可见)

    我有一个球体 球体 表面有对象 引脚 并且带有 DOM 元素 标签 这些元素是从引脚位置到 2d 世界计算得出的 我的问题是 当图钉位于地球后面 通过鼠标拖动或动画 时 我需要隐藏 DOM 中的标签 以便在没有图钉的情况下文本标签不可见 我
  • Android 相机预览在切换相机时冻结?

    我正在为我的应用程序编写一个自定义相机 使用后置或前置摄像头打开活动时 它工作正常 但我真的很难在活动中切换摄像机 当我点击切换相机按钮时 预览冻结但什么也没发生 我已经尝试了与相机和预览相关的其他问题中建议的答案和提示 但没有任何效果 这
  • 如何覆盖jquery/javascript设置的css高度?

    我有这个 var setHeight this outerHeight returns e g 687 someElement css height setHeight px important I want to override thi
  • 使用 g++ 编译多线程代码(-Wl,--no-as-needed 不起作用)

    我的问题实际上是在这里描述的 使用g 编译多线程代码 https stackoverflow com questions 19463602 compiling multithread code with g 但是关于使用 Wl no as
  • 检查进程是否已加载

    有没有办法检查应用程序是否已完成加载 例如 如果我要使用Process newProcess Process Start C someFile xls 有没有IsLoaded or IsFinishedLoading或类似的东西 以便在应用
  • Python sys.argv 超出范围,不明白为什么

    我有一个脚本 我已经使用了一段时间来轻松地将文件上传到我的服务器 它已经工作了很长一段时间 但我无法让它在我的新台式计算机上工作 代码很简单 import os path import sys import os from ftplib i
  • 找到链表中循环的起始节点?

    如何在给定的链表中找到循环的起始节点 我们称其为循环点 到目前为止 我已经了解以下内容 使用慢 快指针 假设列表有一个非循环部分的大小k 缓慢移动 k 步 快速移动 2k 步 快的是 2k k k steps ahead of slow 慢
  • MediaPlayer 视频大小代号?

    我一直在使用 Codename 1 来开发 VideoCapture String file Capture captureVideo Media video MediaManager createMedia file true f add
  • Django/jQuery 级联选择框?

    我想构建一个国家 州选择器 首先 您选择一个国家 地区 该国家 地区的州 省 自治区 直辖市 自治区将显示在第二个选择框中 在 PHP 和 jQuery 中做到这一点相当容易 但我发现 Django 表单在这个意义上有点限制 我可以在页面加