Django开发:如何在项目创建表单中预填充来自报价单的关联数据
解决方案
1. 调整项目应用的URL配置
首先修改projects/urls.py中的创建项目路由,增加可选的报价单ID参数,支持从报价单跳转时传参:
# 原路由(可保留或直接修改) # path('create/', views.create_project, name='create_project') # 修改为支持传报价单ID的格式,如果需要同时支持无参数的普通创建入口,可给参数设置默认值 path('create/<int:quote_id>/', views.create_project, name='create_project'), path('create/', views.create_project, {'quote_id': None}, name='create_project'),
2. 重写create_project视图函数
修改views.py的create_project方法,接收报价单ID参数,获取对应已审批报价单数据后给表单设置初始值,保存时自动关联报价单:
from .models import Project, Quote # 导入你自己的报价单模型,此处假设报价单模型名为Quote @login_required(login_url="/login/") def create_project(request, quote_id=None): projects = Project.objects.all() # 初始化表单初始值 initial = {} related_quote = None if quote_id: # 过滤已审批通过的报价单,避免非法调用,status字段可替换为你实际的审批状态字段 related_quote = Quote.objects.filter(id=quote_id, status='approved').first() if related_quote: # 预填项目名称,可根据你的报价单实际字段调整 initial['description'] = related_quote.project_name initial['quote'] = related_quote.number # 因为当前Project的quote字段是CharField,存储报价单编号即可 # 可自行扩展更多预填字段,例如: # initial['budget'] = related_quote.total_amount 预填预算 # initial['company'] = related_quote.company 预填客户名称 form = ProjectForm(request.POST or None, request.FILES or None, initial=initial) if form.is_valid(): project = form.save(commit=False) # 如果是从报价单创建,自动关联报价单 if related_quote: project.quote = related_quote.number # 如果你后续把Project的quote字段改成外键关联Quote模型,这里直接写project.quote = related_quote即可 project.save() return render(request, 'projects/index_jobs.html', {'project': project,'projects': projects}) context = { "form": form, } return render(request, 'projects/create_project.html', context)
优化提示:当前你的
Project模型中quote字段为CharField,仅能存储报价单编号字符串,如需直接关联报价单记录方便后续数据联动,建议将字段修改为外键类型:quote = models.ForeignKey(Quote, on_delete=models.SET_NULL, blank=True, null=True, verbose_name="关联报价单")
3. 修改报价单页的按钮跳转链接
原来的模板按钮链接{% url 'projects:create_project' %}修改为传入当前报价单ID即可:
<!-- 这里的quote变量是你报价单详情页上下文传递的当前报价单实例 --> <a href="{% url 'projects:create_project' quote_id=quote.id %}" class="btn btn-primary">从报价单创建项目</a>
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

