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
相关产品推荐
相关产品推荐

