Django-grappelli admin: Ошибка обратного совпадения

Я уже давно работаю над проектом 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 и, похоже, не получил вызов.
  • Недавно я не касался каких-либо шаблонов.

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

Ответ 1

У вас есть '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 примечания к выпуску для получения подробной информации об этом.

Ответ 2

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

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

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

до urlpatterns.

Ответ 3

Я столкнулся с этой проблемой сегодня, когда пытался удалить данные в admin. 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)

Ответ 4

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

pip install --upgrade django-grappelli

Ответ 5

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

{% load url from future %}

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

Ответ 6

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

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). Кстати, похоже, что это происходит только при попытке доступа и добавления или редактирования вида. Работает панель управления и списки.