Контекст Django передает только значение None

У меня есть представление, где я хочу передать переменную в мой шаблон, однако значение всегда передается как None, как показано в цифрах 1, 2 и 3. Что я делаю не так, пожалуйста, помогите, я знаю, что это вопрос новичка, на самом деле я очень новичок.

views.py

def create_address(request, dni):
    person = None
    addresses = None
        
    if request.method == 'POST':
        form = CreateAddressForm(request.POST)
        if form.is_valid():
            try:            
                person = Persona.objects.get(numero_documento=dni)
                addresses = Direccion.objects.filter(numero_documento=dni)
                print(f'Persona: {person}') # this print person ID.
            
                f = form.save(commit=False)
                f.numero_documento = person
                f.save()
                
                messages.success(request,
                    'Dirección registrada con éxito.'
                )
                if 'save' in request.POST:
                    return HttpResponseRedirect(reverse('persons:list'))
                if 'add_data' in request.POST:
                    return HttpResponseRedirect(reverse('persons:create_address', kwargs={'dni': dni}))            
            except Persona.DoesNotExist:
                person = None
                messages.error(
                    request,
                    'El número de DNI no existe en la base de datos.'
                )
            except Direccion.DoesNotExist:
                addresses = None
                messages.error(
                    request,
                    'No se ha registrado ninguna dirección.'
                )                        
        else:
            person = None
            messages.error(
                request,
                'No se pudo registrar la dirección.'
            )
    else:
        form = CreateAddressForm()
    template = 'persons/addresses/create_address.html'
    context = {
        'pre_title': 'Direcciones domiciliarias',                   
        'person': person, # (2) The value of "person" is "None".
        'form': form,            
        'addresses': addresses,
    }    
    return render(request, template, context)

template.html

(3) Value of "person" is "None".  

<div class="tab-pane active show" id="tabs-address-data">
     Number of ID is: {{ person }} 
</div>

А person, вероятно, является пользователем. Вы получите этого пользователя, только если:

  1. the request.method == 'POST'
  2. form.is_valid() возвращает True

То же самое, что и addresses - это возвращается в контексте как нечто иное, чем None, только если два вышеуказанных условия истинны.

Вы определяете оба значения в начале функции как None, поэтому, если ничто не изменит значения None, они останутся None.

В случае запроса GET, person и addresses останутся None, потому что они никогда не меняются. Вот почему вы видите None для person.

Я изменил свой код, как показано ниже, спасибо за ваши ответы.

Я хотел бы знать, является ли мой алгоритм теперь правильным.

def create_address(request, dni):
    try:
        person = Persona.objects.get(numero_documento=dni)
        addresses = Direccion.objects.filter(numero_documento=dni)
    except Persona.DoesNotExist:
        person = None
        messages.error(
            request,
            'El número de DNI no existe en la base de datos.'
        )
    except Direccion.DoesNotExist:
        addresses = None
        messages.error(
            request,
            'No se ha registrado ninguna dirección.'
        )

    if request.method == 'POST':
        form = CreateAddressForm(request.POST)
        
        if form.is_valid():
            f = form.save(commit=False)
            f.numero_documento = person
            f.save()

            messages.success(
                request,
                'Dirección registrada con éxito.'
            )
            
            if 'save' in request.POST:
                return HttpResponseRedirect(reverse('persons:list_persons'))
            if 'add_data' in request.POST:
                return HttpResponseRedirect(reverse('persons:create_address', kwargs={'dni': dni}))

        else:            
            messages.error(
                request,
                'No se pudo registrar la dirección.'
            )
    else:    
        form = CreateAddressForm()
        
    template = 'persons/addresses/create_address.html'
    context = {
        'pre_title': 'Direcciones domiciliarias',
        'title': f'{person.nombres} {person.apellido_paterno} {person.apellido_materno}',

        'object': person,
        'form': form,

        'addresses': addresses,
    }
    return render(request, template, context)
Вернуться на верх