Контекст 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
, вероятно, является пользователем. Вы получите этого пользователя, только если:
- the
request.method == 'POST'
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)