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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 11:51:02