我有一个ModelForm,其中使用了FilteredSelectMultiple小部件。当我以创建的超级用户身份登录时,它可以正常工作。但是,当未登录时,我看不到窗体中的小部件,只能看到所有项目的列表(如多选)。所以我的问题是:为什么FilteredSelectMultiple在登录时工作得很好,但是在退出时却没有?
我没有想到的任何地方都没有设置任何权限。
这是我的代码的一部分:
表格
from django.contrib.admin.widgets import FilteredSelectMultiple
class MyModelForm(forms.ModelForm):
my_field = forms.ModelMultipleChoiceField(queryset=Something.objects.all(), widget=FilteredSelectMultiple("Somethings", is_stacked=False), required=False)
class Media:
css = {
'all': (os.path.join(settings.BASE_DIR, '/static/admin/css/widgets.css'),),
}
js = ('/admin/jsi18n'),
class Meta:
model = MyModel
fields = ('some_field', 'some_other_field')
form.html
{% extends base.html %}
{% block head %}
{% load staticfiles %}
some stuff
{% endblock head %}
{% block content %}
<script type="text/javascript" src="{% url 'jsi18n' %}" > </script>
{{ form.media }}
<form enctype="multipart/form-data" method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Submit</button>
</form>
{% endblock content %}
urls.py
url(r'^admin/jsi18n/$',
'django.views.i18n.javascript_catalog',
name='jsi18n'
),
告诉我是否需要其他代码。
(我使用Django 1.8和Python 2.7)
编辑
在注销后加载页面时,控制台将显示以下内容:
jsi18n:SyntaxError:期望的表达式,得到了“
jsi18n:SyntaxError:期望的表达式,得到了“
SelectFilter2.js:ReferenceError:插值未定义
当我以超级用户身份登录时,这些消息均不会出现。
编辑2
如答案中所建议,我尝试将媒体类更改为:
class Media:
# Nécessaire pour l'affichage de FilteredSelectMultiple
css = {
'all': (os.path.join(settings.BASE_DIR, '/static/admin/css/widgets.css'),),
}
extra = '' if settings.DEBUG else '.min'
js = ('/admin/jsi18n', 'jquery%s.js' % extra, 'jquery.init.js', 'core.js', 'SelectBox.js', 'SelectFilter2.js'),
这导致AttributeError:
/ my / url / form中的AttributeError
'tuple'对象没有属性'startswith'
[...]
例外位置:
/path/to/virtualenv/local/lib/python2.7/site-packages/django/forms/widgets.py
在absolute_path中,第74行
我也尝试更改模板:
<script type="text/javascript" src="{% url 'jsi18n' %}" > </script>
<script type="text/javascript" src="{% static 'admin/js/jquery.min.js' %}"></script>
<script type="text/javascript" src="{% static 'admin/js/jquery.init.js' %}"></script>
<script type="text/javascript" src="{% static 'admin/js/core.js' %}"></script>
<script type="text/javascript" src="{% static 'admin/js/SelectBox.js' %}"></script>
<script type="text/javascript" src="{% static 'admin/js/SelectFilter2.js' %}"></script>
{{ form.media }}
这没有产生任何错误,但也没有改变我的问题:(
还有其他想法吗?
最佳答案
我不确定,但这可能是因为该网址位于admin auth下?
url(r'^admin/jsi18n/$',
'django.views.i18n.javascript_catalog',
name='jsi18n'
)
因此,当不以管理员身份登录时,无法访问脚本
jsi18n
,因为您需要通过身份验证才能访问脚本。将网址写为不在admin之下:
url(r'^jsi18n/$',
'django.views.i18n.javascript_catalog',
name='jsi18n'
)