You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:20:41