Тег шаблона URL-адреса Django дает ошибку NoReverseMatch

Я пробовал все, и я прочитал каждый вопрос / ответ по этому вопросу, и у меня ничего не работает. Я надеюсь, что кто-то может предложить другое возможное решение.

У меня есть пара приложений. Один из них ManagerApp, а другой Accounts.

В приложении Accounts есть представление под названием view_user. Он описан в файле URL как

url(r'^user/view/(?P<username>.+)/$', views.view_user, name='view_user')

В base.html есть панель заголовка с именем пользователя. Когда он нажимает на свое имя, я хочу, чтобы он попадал на страницу своего личного профиля. Итак, это читается следующим образом;

...
<ul class="nav navbar-nav navbar-right">
          {% if user.is_authenticated %}
            <li><a href="{% url 'accounts.views.view_user' user.username %}">{{user.username}}</a></li>
          {% else %}
            <li><a href="#">My Account</a></li>
          {% endif %}
...

Но когда я пытаюсь загрузить страницу, я получаю

**NoReverseMatch at /ManagerApp/main/
Reverse for 'accounts.views.view_user' with arguments '(u'johnny',)' and keyword arguments '{}' not found.**

Почему это происходит? Я использую кавычки, с синтаксисом все в порядке. UrlConf назван правильно и т. д. Я просто не вижу проблемы, а прошел уже час :-(

Добавлено

Это определение вида:

def view_user(request, username):
    ''' Shows user data '''
    user = get_object_or_404(User, username = username) #check if user name exist    
    groups = Group.objects.filter(users = user)
    context = {'user': user, 'groupsOfUser': groups}
    return render(request, 'accounts/view_user.html', context)

person CodyBugstein    schedule 28.05.2014    source источник
comment
почему бы вам не использовать вместо этого значение из параметра URL-адреса name? (т.е. {% url 'view_user' username=user.username %}. Также ваш параметр является так называемым именованным параметром, поэтому вы должны передать его даже с его именем (username)   -  person yedpodtrzitko    schedule 28.05.2014
comment
@yedpodtrzitko Как Django узнает, где находится 'view_user', если я не укажу имя приложения? Помните, что это представление находится в другом приложении.   -  person CodyBugstein    schedule 28.05.2014
comment
Ну... единственное, что я могу предложить сейчас, это систематически тестировать каждую часть. Начните с удаления всех требований к параметрам и просто используйте url(r'^user/view/$', views.view_user, name='view_user'). Измените функцию просмотра, чтобы также удалить параметр: def view_user(request):. Если это все еще не работает, вам нужно копнуть глубже, чтобы понять, почему URL-адрес не был загружен. Если это работает, то, вероятно, что-то с регулярным выражением. Лично я всегда использую числовые идентификаторы в URL-адресе и никогда не использую имя пользователя, так как они могут содержать забавные символы. О, и удалите все декораторы представления, чтобы изолировать их как причину   -  person user193130    schedule 28.05.2014
comment
@ user193130 хорошо, спасибо, буду держать вас в курсе...   -  person CodyBugstein    schedule 28.05.2014
comment
....И ПРОБЛЕМА БЫЛА.... Я не выключал и не перезапускал сервер. Когда я сделал это с рекомендованными здесь настройками, это сработало. Спасибо за совет всем.   -  person CodyBugstein    schedule 28.05.2014
comment
Лол, у меня тоже бывает. Тем более, что изменение файлов шаблона НЕ требует перезапуска, но изменение представлений/URL-адресов требует перезапуска. Сложный!!   -  person user193130    schedule 28.05.2014


Ответы (2)


Вам необходимо передать аргумент ключевого слова username внутри шаблона url ярлык:

{% url 'view_user' username=user.username %}

Кроме того, как предложил @yedpodtrzitko, вы можете использовать имя представления вместо полного пути к нему.

Не забудьте перезапустить сервер, чтобы изменения вступили в силу.

person alecxe    schedule 28.05.2014
comment
Вот почему мне не нравятся именованные аргументы в URL-адресах. - person Srinivas Reddy Thatiparthy; 28.05.2014
comment
@Imray Imray хм, хорошо, что теперь за сообщение об ошибке? (пожалуйста, включите полную трассировку) Спасибо. - person alecxe; 28.05.2014
comment
@Imray Попробуйте использовать {% url 'view_user' username=user.username %}, как предложил yedpodtrzitko. Похоже, вы указали неверное имя: accounts.views.view_user - person user193130; 28.05.2014
comment
Даже после предложения @user193130 по-прежнему возникает ошибка: Reverse for 'view_user' with arguments '()' and keyword arguments '{u'username': u'johnny'}' not found. - person CodyBugstein; 28.05.2014
comment
@Imray Imray говорит в трассировке ошибок о том, какой URL-адрес он пробовал? - person alecxe; 28.05.2014
comment
Ну, я пытаюсь открыть главную страницу, которая http://127.0.0.1:8000/ManagerApp/main/, но она расширяет base.html, где находится этот шаблон. - person CodyBugstein; 28.05.2014
comment
@Imray хорошо, не могли бы вы показать свое определение представления view_user? Спасибо. - person alecxe; 28.05.2014
comment
@alecxe Добавлено к вопросу - person CodyBugstein; 28.05.2014
comment
@Imray Просто интересно, действительно ли загружен urlconf, содержащий url(...) ... Если вы посещаете URL-адрес http://127.0.0.1:8000/user/view/johnny/, он отображает шаблон, который вы ожидали, или ошибку 404? - person user193130; 28.05.2014
comment
@Imray, а что, если заменить def view_user(request, username): на def view_user(request, username=None)? - person alecxe; 28.05.2014
comment
@user193130 user193130 Если я удалю проблемную строку из base.html (которая выдает ошибку), да, она отображается правильно - person CodyBugstein; 28.05.2014
comment
@alecxe Да, он все еще отображается правильно - person CodyBugstein; 28.05.2014
comment
@alecxe Смотрите мой комментарий под вопросом и добавьте к своему ответу. Тогда я приму это. Большое спасибо за твою помощь - person CodyBugstein; 28.05.2014

Какую версию джанго вы используете. Если его старый означает 1.3, вам, возможно, придется использовать следующую строку в файле шаблона вверху.

{% load url from future %}

Если вы используете django 1.5, то решение alecxe идеально, потому что кроме этого я не вижу ничего плохого в коде/потоке.

person S.Ali    schedule 28.05.2014
comment
Я использую 1.5, как указано в вопросе - person CodyBugstein; 28.05.2014
comment
Он определенно использует 1.5+, потому что django выдал бы другую ошибку, если бы попытался использовать кавычки в {% url '...' %}... - person user193130; 28.05.2014
comment
@user193130 user193130 на самом деле я столкнулся с подобной ошибкой, когда использовал более старую версию django. Все было хорошо, за исключением случаев, когда я узнаю, что вам нужно использовать тег, который я упоминал выше в более старых версиях. Когда я разместил тег, все заработало .. :) - person S.Ali; 28.05.2014