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

如何在Django模板中创建外键下拉选择框?

手动实现外键下拉选择框的两种方案

你不需要依赖crispy forms,也不用单独编写forms.py文件,就能实现外键的下拉选择框,以下是两种可行方案:

方案一:手动遍历选项构建下拉框

直接在模板中遍历ProjectsTypes的所有实例,手动生成<select>标签,同时设置当前项目的外键值为选中状态:

<form method="POST">
    {% csrf_token %}
    <!-- 项目名称输入框 -->
    <input type="text" id="name" name="name" value="{{ project.name }}"/>

    <!-- 项目类型下拉选择框 -->
    <label for="fk_type">项目类型</label>
    <select id="fk_type" name="fk_type">
        {% for type in project_types %}
            <option 
                value="{{ type.id }}" 
                {% if project.fk_type.id == type.id %}selected{% endif %}
            >
                {{ type.name }}
            </option>
        {% endfor %}
    </select>

    <!-- 其他字段(如notes_design、notes_process)可按同样方式手动添加 -->
    <button type="submit">保存修改</button>
</form>

然后修改views.py,将ProjectsTypes的所有实例传入模板上下文:

class Projects(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Projects
    fields = ['name', 'fk_type', 'notes_design', 'notes_process']
    template_name = 'projects/details_project.html'
    context_object_name = 'projects'

    # 新增方法:传递项目类型数据到模板
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['project_types'] = ProjectsTypes.objects.all()
        return context

    def form_valid(self, form):
        form.instance.fk_user = self.request.user
        form.save()
        return HttpResponseRedirect(self.request.path_info)

    def test_func(self):
        post = self.get_object()
        return self.request.user == post.fk_user

方案二:利用UpdateView自动生成的表单字段

UpdateView会自动基于你的模型创建ModelForm,你可以直接渲染单个字段,既保留Django表单的自动处理能力,又能完全自定义布局(包括按标题分隔字段):

<form method="POST">
    {% csrf_token %}
    <!-- 手动渲染项目名称字段 -->
    <input type="text" id="name" name="name" value="{{ project.name }}"/>

    <!-- 按标题分隔的项目类型字段组 -->
    <div class="field-group">
        <h3>项目类型设置</h3>
        {{ form.fk_type.label_tag }}
        {{ form.fk_type }}
    </div>

    <!-- 按标题分隔的设计备注字段组 -->
    <div class="field-group">
        <h3>设计备注</h3>
        {{ form.notes_design }}
    </div>

    <!-- 其他字段同理 -->
    <button type="submit">保存修改</button>
</form>

这种方式不需要手动处理选项遍历和选中状态,Django会自动完成这些工作,同时你可以通过HTML结构自由分组字段,完全满足按标题分隔的需求。

注意事项

  • 表单字段的name属性必须和模型字段名一致(比如外键字段的name是fk_type),否则Django无法正确接收并保存数据。
  • 如果你的外键字段允许为null,方案一中需要增加空值判断避免报错:{% if project.fk_type and project.fk_type.id == type.id %}selected{% endif %}

内容的提问来源于stack exchange,提问作者Game Analysis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:05:20