2009-09-24 2 views
0

У меня есть мнение Джанго, который выглядит как ...Джанго код вида функции запускается после возвращения

 
    def add_user(request): 
     if User.objects.get(username__exact = request.POST['username']): 
      context = { 'message': "Username already taken"} 
      return render_to_response("mytemplate.html", context, RequestContext(request)) 

     newUser = User(username="freeandclearusername") 
     newUser.save() 

     #then other code that is related to setting up a new user. 

Другого код, который связан с созданием пользователя все еще бежал, даже если первоначальный условный оператор не может и вызывается «return render_to_response()».

Страница отображается с правильным контекстом, но другая информация добавляется в базу данных после первоначального возврата. Я думал, что код после «return render_to_response()» не будет запущен.

Может ли это подтвердить или объяснить это?

UPDATE ....

ИТАК, если добавить условное ....

def add_user(request): 
    if User.objects.get(username__exact = request.POST['username']): 
     bad_user = True 
     context = { 'message': "Username already taken"} 
     return render_to_response("mytemplate.html", context, RequestContext(request)) 

    newUser = User(username="freeandclearusername") 
    newUser.save() 

    if bad_user != True: 
     #then other code that is related to setting up a new user. 
     context = { 'message': "Username is great!!!!!"} 
     return render_to_response("mytemplate.html", context, RequestContext(request)) 

Это ведет себя, как и ожидалось. Кроме того, если я удаляю RequestConext(), он, как представляется, ведет себя корректно.

Любые идеи? Я думаю, что проблема заключается в том, как я использую RequestContext.

+0

render_to_response обычно занимает RequestContext в качестве ключевого слова аргумента, называемого "context_instance", т.е. render_to_response ("mytemplate.html", контекста, context_instance = RequestContext (запрос)) Но я не сразу понимаю, как это может повлиять исполнение вашего кода ... –

ответ

1

Оператор возврата действительно прекратит выполнение функции. Так что если вы видите другой код выполняется, вы либо

  • не выполнить оператор возврата, и, таким образом, производят вывод как-то по-другому, или
  • имеют другой код (до того, как функция вызывается, или в промежуточное ПО), что приводит к изменению базы данных.
0

Вы считаете правильным, что, если ваши условия выполнены, представление будет выходить из вашего оператора возврата. Единственное, о чем я могу думать, о котором еще не упоминалось, - это отступы - дважды проверьте, что у вас нет комбинации вкладок и пробелов. Иногда это может привести к неожиданностям.

Смежные вопросы