Администратор Django-grappelli: ошибка обратного соответствия - PullRequest
10 голосов
/ 25 августа 2011

Я уже некоторое время работаю над проектом django, который использует grappelli для администратора, и сегодня внезапно мой шаблон change_form.html выдает следующую ошибку:

Caught NoReverseMatch while rendering: Reverse for "grp_related_lookup" with arguments '()' and keyword arguments '{}' not found.

Неправильная строка кода - строка 38:

37    $.each(related_lookup_fields_fk, function() {
38        $("#id_" + this).grp_related_fk({lookup_url:"{% url grp_related_lookup %}"});
39    });

, которому предшествует этот бит кода:

var related_lookup_fields_fk = {% get_related_lookup_fields_fk adminform.model_admin %};

Очевидно, что это {% url grp_related_lookup %} бит, который вызывает проблему.

Я не понимаю, как шаблон разрешает grp_related_lookup в grappelli.views.related.related_lookup. Я попытался заменить grp_related_lookup на grappelli.views.related.related_lookup, и это тоже не сработало. Также в шаблоне оскорбительная строка выглядит так:

$("#id_" + this).grp_related_fk({lookup_url:"{% url grp_related_lookup %}"});

но в сообщении об ошибке это выглядит так:

$("#id_" + this).grp_related_fk({lookup_url:"{% url 'grp_related_lookup' %}"});

Я не знаю, может ли одиночные кавычки вокруг grp_related_lookup как-то иметь отношение к проблеме или нет. Это как django визуализировал вызов функции? Передает ли строка 'grp_related_lookup' в тег шаблона URL? Если это так, что могло привести к тому, что это внезапно сломалось ?

Дополнительная информация:

  • Значение related_lookup_fields представляет собой пустой список []. Я не определяю related_lookup_fields в моем admin.py.
  • Я бросил пару операторов отладки в функцию grappelli.views.related.related_lookup view, и она, кажется, не вызывается.
  • В последнее время я не трогал ни один из шаблонов.

Надеюсь, кто-то может указать мне правильное направление ... Спасибо!

Ответы [ 6 ]

19 голосов
/ 25 августа 2011

У вас все еще есть 'grappelli.urls', включенный в ваш URLconf?Это единственная причина, по которой я вижу, что это приведет к этой ошибке.Вы можете попробовать использовать python manage.py shell:

from django.core.urlresolvers import reverse
print reverse('grp_related_lookup')

Если эта строка возвращает правильный URL, вы не должны получить NoReverseMatch в своем шаблоне.

Кавычки вокруг grp_related_lookupне должно быть проблемой.Тег {% url %} принимает строки в кавычках и без кавычек в качестве первого аргумента, поэтому django нормализует его для строк в кавычках.Это поведение изменится в будущем: вы сможете передавать переменные шаблона в {% url %}, используя строки без кавычек.{% url foo %} и {% url "foo" %} не дадут одинакового результата, подробности об этом см. В примечаниях к выпуску 1.3 .

6 голосов
/ 03 апреля 2013

Я столкнулся с таким же поведением с Django 1.5 и Grappelli 2.4.4.

Чтобы решить проблему, мне пришлось добавить

url(r'^grappelli/', include('grappelli.urls')),

к urlpatterns.

1 голос
/ 27 января 2015

Я столкнулся с этой проблемой вчера.Я использовал Django-grapelli, который был включен в установку FileBrowser.Я решил проблему, улучшив Джанго-Грейпелли.Просто введите:

pip install --upgrade django-grappelli
1 голос
/ 21 января 2015

Я столкнулся с этой проблемой сегодня, когда пытался удалить данные в админке. Reverse for 'app_list' with arguments '()' and keyword arguments '{'app_label': ''}' not found.

Я положил url(r'^grappelli/', include('grappelli.urls')) в urls.py

Решение довольно странное: просто обновите grappelli до последней версии. (Я обновил его с 2.5.6 до 2.6.3)

0 голосов
/ 26 мая 2015

Кажется, я столкнулся с той же проблемой, но когда я запускаю предложенный консольный тест, я получаю следующее:

Python 2.7.9 (default, Apr  7 2015, 07:58:25)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.core.urlresolvers import reverse
>>> print reverse('grp_related_lookup')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/tsantor/.virtualenvs/project_env/lib/python2.7/site-packages/django/core/urlresolvers.py", line 579, in reverse
    return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))
  File "/Users/tsantor/.virtualenvs/project_env/lib/python2.7/site-packages/django/core/urlresolvers.py", line 496, in _reverse_with_prefix
    (lookup_view_s, args, kwargs, len(patterns), patterns))
NoReverseMatch: Reverse for 'grp_related_lookup' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

А мой urls.py выглядит так:

urlpatterns = patterns(

    # Admin
    url(r'^grappelli/', include('grappelli.urls')),
    url(r'^admin/', include(admin.site.urls), name="admin"),

    # main views
    #url(r'^$', RedirectView.as_view(url='/admin'), name='home'),

    # API
    url(r'^api/', include('api.urls', namespace='api')),
)

У меня также есть последняя версия Grappelli (2.6.4), работающая на Django (1.8.2). Кстати, кажется, что это происходит только тогда, когда я пытаюсь получить доступ и добавить или изменить представление. Панель управления и списки работают.

0 голосов
/ 09 февраля 2012

У меня была похожая проблема с URL и я заметил, что мне нужно

{% load url from future %}

в шаблоне, если я хочу использовать URL-теги в кавычках. Это также упоминается в официальной документации django: https://docs.djangoproject.com/en/1.3/ref/templates/builtins/#url

...