2017-08-24 77 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