如何在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
相关产品推荐
相关产品推荐

