2015-06-23 4 views
1

Django новичок здесь, нужна помощь по базовому промежуточному программному обеспечению, чтобы перенаправить на другой вид, если определенное поле модели пусто.Как перенаправить в промежуточное ПО django? глобальное имя 'view' не определено

Я создаю страницу условий соглашения, с которой пользователи должны перенаправляться сразу после регистрации на платформе, если поле filed_terms в их модели профиля пуста.

Я использую для этого промежуточное ПО. Однако я не могу заставить это работать. Это мой промежуточный класс:

class TermsMiddleware(object): 

    def process_request(self, request): 

     if request.user.profile.filled_terms is None: 
      return redirect(reverse(terms)) 

Это дает мне следующее сообщение об ошибке:

global name 'terms' is not defined 

Я также сличитель URL-адреса, который прекрасно работает, когда я перейти к нему вручную:

url(r'^terms/', 'my_app.views.terms') 

У меня есть шаблон terms.html и вид терминов в файле views.py, который отлично работает во всех других отношениях. Я также добавил его к настройкам промежуточного программного обеспечения, чтобы убедиться, что он загружается.

Должен ли я импортировать что-то из представлений или диспетчера url в файл промежуточного программного обеспечения? Если да, то что бы это было? Я на это некоторое время не могу найти ничего полезного.

ответ

1

reverse функция принимает url имя вместо этого в регулярном выражении. Поэтому вам нужно добавить name в конфигурацию url. Вот пример.

url(r'^terms/', 'my_app.views.terms', name='terms') 

Добавить это в views.py

from django.core.urlresolvers import reverse 

И вам нужно исправить вашу обратную функцию в.

return redirect(reverse('terms')) 

Python интерпретировать ваш terms как переменные и у вас нет переменного с именем terms в то время как вам нужно поместить строку на reverse.

+0

Каким образом URL-адрес работает, когда я иду к нему вручную? – Javier

+0

, потому что, когда вы добрались до URL-адреса вручную, он будет использовать ваше регулярное выражение на URL-адресе, а 'reverse' будет использовать' name'. Вы можете заставить свой код работать, удалив «обратный» в 'return redirect ('terms')' –

+0

Когда я пытаюсь выполнить ваше решение, я просто постоянно переадресую на термины. Я думаю, что его цикл к терминам, которые не остановятся. – Javier