2015-08-28 2 views
1

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

urls.py

url(r'^signupform/$', views.render_signup, name='render_signup'), 
url(r'^signup/$', views.sign_up_account_admin, name='sign_up_account_admin'), 

views.py

def render_signup(request): 
    """ 
    """ 
    data_dict = {"some_keys":"some_values"} 
    return render(request, "admin.html", data_dict) 



def sign_up_account_admin(request): 
    """ 
    """ 
    user = None 
    user, msg = save_form_data(request) 
    req_dict = {"msg": msg} 
    if user: 
     ret = redirect('homepage') #-- This works pretty fine 
    else: 
     ret = redirect('/signupform/', resp = req_dict) #-- This redirects but I don't get the `resp` Objects in the template 
    return ret 

Html Temlpate

<div class="container"> 
     =={{resp}} 
     ===>>>>>>>{{resp.msg}} 
    </div> 

И выход HTML

<div class="container"> 
     == 
     ===>>>>>>> 
    </div>   
+0

'redirect()' не передает свои параметры шаблону. Это похоже на то, что вы делаете новый запрос к указанному URL-адресу. Вы можете передавать данные в параметрах запроса или сеансе, если вам нужно. –

+0

@ YaroslavAdmin - Я думал, что мы смогли сделать это с помощью 'HttpResponseredirect', передав kwargs методом' reverse'. Есть ли у нас такой другой вариант? – Laxmikant

+0

Да, если у вас есть url, определенный как '/ some-url/{id} /', то передача 'kwargs' в' reverse' будет заполнять '{id}'. Это совершенно разные вещи. –

ответ

3

Вы не можете пройти мимо kwargs до функции redirect.

Аргументы, переданные redirect, являются теми же позиционными или ключевыми аргументами, которые вы бы передали, если бы вы использовали reverse() для генерации URL-адреса. Эти аргументы используются для отмены разрешения URL-адреса.

Как упоминалось в документации Django об использовании redirect() function.

Пропустив имя зрения и необязательно некоторые позиционные или ключевые аргументы; URL-адрес будет реконструирован с использованием метода reverse().

Теперь, когда вы проходите жестко запрограммированный URL-адрес, аргумент, переданный вместе с ним, будет отброшен.

Рекомендуемый способ использования redirect() с закодированным URL, как указано в Django Документах:

def my_view(request): 
    ... 
    return redirect('/some/url/') 

Итак, что вы можете сделать сейчас использовать для сеансов Django или возможно передать параметр в URL для получить доступ к значению resp в представлении render_signup.

Solution-1 Использование Django Sessions

Один из способов заключается в использовании сессий Django, чтобы получить msg.

def sign_up_account_admin(request): 
    """ 
    """ 
    user = None 
    user, msg = save_form_data(request) 
    req_dict = {"msg": msg} 
    if user: 
     ret = redirect('homepage') #-- This works pretty fine 
    else: 
     request.session['resp'] = msg # set in session 
     ret = redirect('/signupform/') 

    return ret 

Затем в render_signup зрения, вы можете сделать:

def render_signup(request): 
    """ 
    """ 
    resp = request.session.get('resp') # get the value from session 
    data_dict = {'resp': resp, ..} 
    return render(request, "admin.html", data_dict) 

Solution-2 Pass как параметры URL

Другим решением является передать его в URL в качестве параметров запроса.

ret = redirect('/signupform/?resp=%s'%msg) # pass as query parameter 

Тогда в render_signup зрения, получить это значение из request.GET.

resp = request.GET.get('resp') # get the value of 'resp' from request.GET 
data_dict = {'resp':resp, ..} 

EDIT:

Если у вас есть несколько параметров для отправки, которые находятся в словаре, то вы можете использовать urllib.urlencode() для кодирования словаря и отправить его с URL.

encoded_string = urllib.urlencode(my_dict) 
redirect('/signupform/?%s'%encoded_string) # attach the encoded string in the url 

Затем на ваш взгляд, вы можете получить ключи словаря из request.GET.

value1 = request.GET.get('key1') 
value2 = request.GET.get('key2') 
+0

Спасибо за ответ. Но у меня есть довольно большой словарь, чтобы вернуться, поэтому не очень хорошая идея хранить большой словарь в сеансе. Поэтому я пошел бы с другим решением. :( – Laxmikant

+0

Вы можете закодировать словарь на 'percent-encoded' string и передать его вместе с URL-адресом. Обновлен ans. –