Django中如何将一个表单字段值设为另一个表单的默认值
解决表单间传递reference值作为默认值的问题
我来帮你搞定这个表单传值的需求!其实有两种简单的实现方式,咱们一个个说:
方法一:通过URL参数传递(最直接)
这种方式适合非敏感数据,操作起来简单直观:
1. 调整URL路由配置
在你的urls.py里,把add_manifest的路由改成能接收reference参数的形式:
# urls.py from django.urls import path from . import views urlpatterns = [ # 其他路由... path('add-order/', views.add_order, name='add_order'), # 根据你的reference类型调整参数格式,比如数字用<int:reference> path('add-manifest/<str:reference>/', views.add_manifest, name='add_manifest'), ]
2. 修改add_order视图,跳转时带上参数
当CreateOrderForm验证通过并保存后,把用户输入的reference通过redirect传递给add_manifest:
# views.py def add_order(request): if request.method == "POST": form = CreateOrderForm(request.POST) if form.is_valid(): form.save() # 从cleaned_data取出验证后的reference,传递给目标路由 return redirect('add_manifest', reference=form.cleaned_data['reference']) else: form = CreateOrderForm() return render(request, 'add_order.html', {'form': form})
3. 修改add_manifest视图,设置表单默认值
在初始化CreateManifestForm时,把URL参数里的reference作为初始值传入:
# views.py def add_manifest(request, reference=None): if request.method == "POST": form = CreateManifestForm(request.POST) if form.is_valid(): form.save() # 如果希望用户继续添加运单时保留reference,可以在这里也带上参数 # return redirect('add_manifest', reference=form.cleaned_data['reference']) return redirect('add_manifest') else: # 有参数就设置为表单默认值,没有就空着 initial_data = {'reference': reference} if reference else {} form = CreateManifestForm(initial=initial_data) manifests = Manifests.objects.all() context = { 'form': form, 'manifests': manifests, } return render(request, 'add_manifest.html', context)
方法二:通过Session存储(适合敏感数据)
如果你的reference是敏感信息,不想暴露在URL里,可以用Session来存:
1. 修改add_order视图,把值存入Session
def add_order(request): if request.method == "POST": form = CreateOrderForm(request.POST) if form.is_valid(): form.save() # 把reference存入session request.session['order_reference'] = form.cleaned_data['reference'] return redirect('add_manifest') else: form = CreateOrderForm() return render(request, 'add_order.html', {'form': form})
2. 修改add_manifest视图,从Session取值并设置默认值
def add_manifest(request): # 从session获取reference,没有的话返回空字符串 reference = request.session.get('order_reference', '') if request.method == "POST": form = CreateManifestForm(request.POST) if form.is_valid(): form.save() # 用完删除session里的这个值,避免后续访问还带着 if 'order_reference' in request.session: del request.session['order_reference'] return redirect('add_manifest') else: form = CreateManifestForm(initial={'reference': reference}) # 如果只需要一次传递,这里也可以提前删除session # if 'order_reference' in request.session: # del request.session['order_reference'] manifests = Manifests.objects.all() context = { 'form': form, 'manifests': manifests, } return render(request, 'add_manifest.html', context)
两种方式都能实现你要的效果,选哪种看你的实际需求就行~
内容的提问来源于stack exchange,提问作者GXM100
相关产品推荐
相关产品推荐

