Django视图向模板传递变量始终为None问题求助
Django视图传递变量为None的问题解决
问题原因
你的代码里,person和addresses的赋值逻辑仅放在POST请求且表单验证通过的try块中。但用户首次访问视图是GET请求(比如从其他页面跳转),此时不会进入POST分支,person保持初始值None;另外点击add_data按钮重定向回该视图时,同样是GET请求,不会执行查询person的代码,因此模板中拿到的person始终为None。
解决方案
将查询Persona和Direccion的逻辑移到请求方法判断的外部,确保无论GET还是POST请求,只要传入合法的dni,就能获取到对应的person对象。同时统一处理Persona.DoesNotExist异常,避免dni无效时出现问题。
修改后的views.py代码
def create_address(request, dni): person = None addresses = None # 所有请求先尝试根据dni查询person和地址 try: person = Persona.objects.get(numero_documento=dni) addresses = Direccion.objects.filter(numero_documento=dni) except Persona.DoesNotExist: 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) # 确保person存在才执行保存逻辑 if form.is_valid() and person is not None: 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})) 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', 'person': person, 'form': form, 'addresses': addresses, } return render(request, template, context)
修改说明
- 将查询逻辑移至最外层,确保所有请求都会执行person和地址的查询,解决GET请求下变量为None的问题。
- POST表单验证时增加
person is not None判断,避免person不存在时执行无效的保存操作。 - 统一异常处理逻辑,无论GET还是POST请求,只要dni无效都会给出对应错误提示。
内容的提问来源于stack exchange,提问作者Oile Nosreg
相关产品推荐
相关产品推荐

