Как получить контекст одного представления к другому в Django - PullRequest
0 голосов
/ 05 февраля 2020

Я хочу добавить контекст в моем представлении create_form, но я получаю

UnboundLocalError: локальная переменная 'range', на которую ссылается перед присваиванием

Должен быть доступен контекст представления create_form в create_test_bills.

from django.shortcuts import render, redirect
from .forms import TestForm
from .models import Test
from django.template.loader import get_template
from django.http import HttpResponse

from project.utils import render_to_pdf 

def create_form(request):
    if request.method == 'POST':
        range = request.POST.get('range')
        results = request.POST.get('results')
        unit = request.POST.get('unit')
        print(range,results,unit)
        return redirect('test_bills')

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


def create_test_bills(request,*args, **kwargs):

    if request.method == 'POST':
        range = request.GET.get('range')
        results = request.GET.get('results')
        unit = request.GET.get('unit')
    pdf = render_to_pdf('invoice.html',{'range':range,'results':results,'unit':unit,})

    return HttpResponse(pdf, content_type='application/pdf')

Мой шаблон для формы. html. Я включил некоторые обязательные поля.

<form method="POST">
    {% csrf_token %}
    <div class="container">
      <input type="text" placeholder="Range" name="range" required>
      <input type="text" placeholder="Results" name="results" required>
      <input type="text" placeholder="Unit" name="unit" required>
      <button type="submit" class="registerbtn">Register</button>
    </div>
  </form>
</body>
</html>

1 Ответ

1 голос
/ 05 февраля 2020

Я вижу ряд проблем в вашем коде. Прежде всего, вы должны знать, что redirect является (по крайней мере, насколько мне известно) запросом GET. Таким образом, вы отправляете свои данные в первый просмотр с помощью запроса POST и передаете их с запросом GET.

Во-вторых, в своем представлении create_test_bills вы проверяете, чтобы метод запроса был a POST и затем вы пытаетесь получить параметры GET. Таким образом, вы никогда не получите здесь свои параметры.

В-третьих, в вашем представлении create_test_bills вы пытаетесь отобразить pdf независимо от того, является ли запрос POST или нет. Поскольку перенаправление является запросом GET, ваш код ниже if request.method == "POST" не вызывается, и вы получаете сообщение об ошибке.

Чтобы передать параметры, я вижу два подхода. Одним из способов является создание URL-адреса перенаправления в представлении create_form, например:

def create_form(request):
    if request.method == 'POST':
        range = request.POST.get('range')
        results = request.POST.get('results')
        unit = request.POST.get('unit')
        print(range,results,unit)
        url = reverse('test_bills')+'?range=%s&results=%s&unit=%s' % (range, results, unit)
        return redirect(url)

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

Второй подход заключается в использовании сеансов для хранения данных POST, как описано в этой записи SO, например

def create_form(request):
    if request.method == 'POST':
        request.session['_my_data'] = request.POST
        return redirect('test_bills')

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

def create_test_bills(request):

    data = request.session.get('_my_data')
    pdf = render_to_pdf('invoice.html',{'range':data['range'],'results':data['results'],'unit':data['unit'],})

    return HttpResponse(pdf, content_type='application/pdf')
...