2016-05-20 2 views
1

Я пытаюсь передать несколько переменных в рендеринг Django. Один из них - токен csrf, а другой - моя форма (потому что мне нужны ошибки из формы). По какой-то причине никто из них не работает. Любая помощь?Django, передающий несколько переменных в рендере

Вот шаблон:

<form class = "navbar-form" action="{% url "registry.views.register" %}" onsubmit=" return ClickButton(); " method= "POST" > 
{% csrf_token %} 
{{ form.errors}} {{ form.non_field_errors }} 

здесь является view.py:

Защиту регистр (запрос):

form_save = RegisterationForm() 
if request.method == 'POST': 
    form = RegisterationForm(request.POST) 

    if form.is_valid(): 

     user_info={} 
     user_info['username'] = form.cleaned_data['username'] 
     user_info['password'] = form.cleaned_data['password'] 


     form.save(user_info) 
     return render_to_response('register_success.html',user_info) 

    else: 
     form_save = form 


return render_to_response('register.html',{'csrf':csrf(request),'locals':locals()}) 

ответ

3

Зачем проходить csrf вручную? {% csrf_token %} делает это автоматически.

Кроме того, если вы используете новую версию Django, вы можете использовать render().

return render(request, 'register.html', {'form': form}) 

Это должно быть сделано.

1

Если вы не использовали {} словарный словарь, я предлагаю изменить:

return render_to_response('register.html',{'csrf':csrf(request),'locals':locals()}) 

использовать **, чтобы развернуть locals() - вернул словарь по ключевым словам. Но это, вероятно, не сработает.

return render_to_response('register.html',{'csrf':csrf(request),**locals()}) 

Попробуйте вместо этого:

my_dict = {csrf:csrf(request)} 

my_dict.update(locals()) 

return render_to_response(
    'register.html', 
    my_dict, 

) 

Тем не менее, вероятно, чище явно передать то, что вы хотите, используя Dict конструктор:

return render_to_response(
    'register.html', 
    dict(
     csrf=csrf(request), 
     user_info=user_info, 
     form=form, 
    ) 

) 

И причина ваш шаблон Безразлично 't find say form заключается в том, что его нет в контексте. Контекст имеет csrf и местные жители, где вид проживает. Вместо этого вы можете ссылаться на {{locals.form}}. Но это уродливо.

0

Вам не нужно передавать токен csrf, вы можете украсить функцию view с помощью @csrf_protect, чтобы передать токен в текущий контекст. Форма может быть добавлена ​​в словарь контекста:

@csrf_protect 
def your_view(request): 
    # process request 

    # add form to context dictionary, and return RequestContext for current request 
    return render_to_response('register.html', {'form': form}, RequestContext(request)) 

В качестве альтернативы, вы можете сделать сайт широкой csrf защиты путем добавления 'django.middleware.csrf.CsrfViewMiddleware' к вашему MIDDLEWARE_CLASSES (обычно добавляется по умолчанию). Вы должны прочитать больше от docs

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