You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Form的Media类js属性渲染异常:逐个解析文件名字符

Django Form Media JS 文件被拆分为单个字符生成Script标签的问题

我决定自行实现所需功能,这意味着要在Django表单中添加JavaScript代码。我的表单代码如下:

class SoundTestPairForm(forms.Form): 
    LANGUAGE_CHOICES = [[d['language'], d['language']] for d in Sound.objects.order_by('language').values('language').distinct()] 
    lesson_name = forms.CharField(widget=forms.HiddenInput()) 
    sound_pk = forms.CharField(widget=forms.HiddenInput()) 
    master_phrase1 = forms.CharField(widget=forms.HiddenInput()) 
    master_phrase2 = forms.CharField(widget=forms.HiddenInput()) 
    sex = forms.MultipleChoiceField( choices=Sound.SEX_CHOICES ) 
    starts_with = forms.MultipleChoiceField( choices=Sound.POS_CHOICES ) 
    language = forms.MultipleChoiceField( choices=LANGUAGE_CHOICES ) 
    user_sound = forms.ModelMultipleChoiceField( queryset=Sound.objects.all(), ) 

    class Media: 
        js = ('filter_queryset.js')  # 这里是问题所在!

但当我执行form_instance = SoundTestPairForm()并调用form_instance.media.render时,得到的结果是每个文件名字符对应一个<script>标签:

[u'<script type="text/javascript" src="/static/f"></script>', u'<script type="text/javascript" src="/static/i"></script>', u'<script type="text/javascript" src="/static/l"></script>', u'<script type="text/javascript" src="/static/t"></script>', u'<script type="text/javascript" src="/static/e"></script>', u'<script type="text/javascript" src="/static/r"></script>', u'<script type="text/javascript" src="/static/_"></script>', u'<script type="text/javascript" src="/static/q"></script>', u'<script type="text/javascript" src="/static/u"></script>', u'<script type="text/javascript" src="/static/y"></script>', u'<script type="text/javascript" src="/static/s"></script>', u'<script type="text/javascript" src="/static/"></script>', u'<script type="text/javascript" src="/static/j"></script>']

调用render_js()也得到相同结果,为何会逐个解析文件名字符而非识别完整文件名?这是遇到Bug了吗?


问题原因

这不是Bug,是你在定义Media类的js属性时忽略了一个关键细节:Django要求js属性的值必须是可迭代的集合类型(比如列表、元组)。当你写js = ('filter_queryset.js')时,括号并没有让它变成元组——这只是一个被括号包裹的字符串而已。Django会把这个字符串当成字符序列来遍历,每个字符都会被当作一个独立的JS文件路径,于是就生成了一堆指向单个字符的错误<script>标签。

解决方案

只需要把js的值改成元组(注意末尾的逗号)或者列表即可:

方法1:使用元组(推荐,Django官方示例风格)

class Media:
    js = ('filter_queryset.js',)  # 末尾的逗号不能少!

方法2:使用列表

class Media:
    js = ['filter_queryset.js']

这样Django就会把整个字符串识别为一个完整的JS文件路径,生成正常的单个<script>标签,而不是拆分字符了。

内容的提问来源于stack exchange,提问作者AmagicalFishy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:38:42