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

如何在Django表单中引用其他模型?附相关代码示例

如何在Django表单中引用关联模型?

嘿,我来帮你搞定这个Django表单关联其他模型的事儿!先提个小细节:你给的模型里写的是Inven,但视图里用的是Inventory,应该是笔误吧?下面我就统一用Inven来讲解啦~

1. 先创建关联外键的表单

首先在你的app里新建forms.py文件,用ModelForm来生成表单。对于外键字段employee,Django会自动生成下拉选择框,但我们可以自定义它的显示效果,比如让下拉框显示员工姓名:

# forms.py
from django import forms
from .models import Inven, Employee

class InvenForm(forms.ModelForm):
    # 自定义外键字段的下拉选项,显示员工姓名
    employee = forms.ModelChoiceField(
        queryset=Employee.objects.all(),  # 所有员工作为选项
        empty_label="请选择所属员工",  # 下拉框默认的空选项文本
        label="所属员工"
    )

    class Meta:
        model = Inven
        fields = ['name', 'sn', 'employee']  # 指定表单要包含的字段

2. 在视图中使用这个表单

用类视图的方式(比如CreateView)

如果你习惯用类视图,直接指定表单类就可以,非常省心:

# views.py
from django.views.generic.edit import CreateView
from .models import Inven
from .forms import InvenForm

class InvenCreateView(CreateView):
    model = Inven
    form_class = InvenForm
    success_url = '/inventory/'  # 表单提交成功后跳转的URL,换成你自己的路由

用普通函数视图的方式

如果更喜欢函数视图,这样处理也很灵活:

# views.py
from django.shortcuts import render, redirect
from .forms import InvenForm

def add_inven(request):
    if request.method == 'POST':
        form = InvenForm(request.POST)
        if form.is_valid():
            form.save()  # 直接保存到数据库
            return redirect('inventory_list')  # 跳转到你的库存列表视图,记得在urls里配置这个name
    else:
        form = InvenForm()  # GET请求时生成空表单
    return render(request, 'add_inven.html', {'form': form})

3. 在模板里渲染表单

创建对应的模板文件(比如templates/add_inven.html),直接渲染表单就行,Django会自动把外键字段渲染成下拉选择框:

<!-- templates/add_inven.html -->
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}  <!-- 用p标签自动渲染所有字段,也可以单独渲染每个字段比如{{ form.name }} -->
    <button type="submit">保存库存</button>
</form>

另外,补充一下:如果你的InventoryListView要正确显示关联的员工信息,记得把视图里的model = models.Inventory改成model = models.Inven,然后在列表模板里可以这样调用员工信息:

<!-- templates/inventory_list.html -->
{% for inven in inventorys %}
    <div>
        <p>物品名称:{{ inven.name }}</p>
        <p>SN码:{{ inven.sn }}</p>
        <p>所属员工:{{ inven.employee.name|default:"未分配" }}</p>
    </div>
{% endfor %}

内容的提问来源于stack exchange,提问作者Dicky Raambo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:15:36