2017-08-24 80 views
0

我有一个使用FilteredSelectMultiple小部件的ModelForm。当我以我创建的超级用户身份登录时,它工作得很好。但是,如果未登录,我无法在窗体中看到小部件,只能看到所有项目的列表(如多选)。所以我的问题是:为什么FilteredSelectMultiple在登录时工作得很好,但在退出时不在那里?Django的FilteredSelectMultiple小部件仅在登录时才起作用

我还没有设置类似的任何地方,我能想到的任何许可或任何东西。

这里是我的代码部分:

forms.py

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: expected expression, got '<'

jsi18n : SyntaxError: expected expression, got '<'

SelectFilter2.js : ReferenceError: interpolate is not defined

这些消息都没有出现,当我在我登录作为超级用户。

EDIT 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:

AttributeError at /my/url/form

'tuple' object has no attribute 'startswith'

[...]

Exception Location: /path/to/virtualenv/local/lib/python2.7/site-packages/django/forms/widgets.py in absolute_path, line 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 }} 

它没有产生任何错误,但什么也没有改变我的问题:(

任何其他的想法?

回答

1

我不能完全肯定,但也可能是因为该网址是在管理身份验证?

url(r'^admin/jsi18n/$', 
    'django.views.i18n.javascript_catalog', 
    name='jsi18n' 
) 

所以当没有登录为管理员,脚本jsi18n不能因为你需要被认证为管理员访问脚本访问。

写的网址上不能下管理员:

url(r'^jsi18n/$', 
    'django.views.i18n.javascript_catalog', 
    name='jsi18n' 
) 
+0

看起来很简单!非常感谢!对不起,我没有足够的代表upvote ... – iHaveNoIdeaWhatsoever

+0

你很欢迎; 'tuple'对象没有属性'startswith'错误应该是因为我们的Media类属性定义中多了额外的逗号(,)? – sergiuz

0

这可能是由于这样的事实,登录和查看在管理时,它的加载经由小组件的媒体属性额外的JavaScript。

看看这个小部件的源位置: https://github.com/django/django/blob/master/django/contrib/admin/widgets.py

看看那些javascript中的小部件的媒体属性文件,当你没有登录加载如果他们没有,尝试将它们添加到您的形式的媒体。 。

+0

它没有工作 - 或者我没有管理,使其工作 - 请看看我的第二个编辑。 – iHaveNoIdeaWhatsoever