Django-select下拉菜单的显示与保存:
场景应用
用于数据表有使用外键,然后又需要在前端展示,增删改查的时候改如何写。
image.png
例子:
user表,其中部门使用外键(dept表的id)多对一的关系(下文用了emp雇员,方法一样)
想要达到的效果:
- 在前端表单展示用户的信息,包括部门信息
可修改部门,修改的select下拉菜单可选已经录入的部门信息,下拉单选
image.png
models文件
class dept(models.Model):
deptname = models.CharField(max_length=20, null=True, verbose_name="部门名称")
class emp(models.Model):
username = models.CharField(max_length=20, verbose_name="姓名") #姓名
dept = models.ForeignKey(dept, on_delete=models.CASCADE, verbose_name="所在部门") #关联部门
说明:这里不用多解释,就是普通定义emp表和dept表,注意emp的dept部门字段使用的ForeignKey多对一关系,去关联dept表的主键(dept没有重新定义主键,则是默认的主键id)
views文件
@login_required
def userAdd(request):
if request.method == 'GET':
deptlist = dept.objects.all()
return render(request, 'userAdd.html', locals())
elif request.method == 'POST':
username = request.POST.get('username')
dept = request.POST.get("dept")
emp = Emp()
emp.username = username
emp.dept_id = dept
emp.save()
return redirect(reverse('sta:userList'))
说明:这里的例子是保存时候的操作,既要展示不同部门的下拉菜单,又要能够保存成功。需要注意以下地方:
1.要重新定义get,实现当加载网页的时候能够展示已保存的部门信息,所以有个deptlist = dept.objects.all()
,在html中要使用deptlist取部门表中的值。
2.当使用POST要保存的时候还是按照正常逻辑,先从html取对应的值,然后新建一个emp()对象,给对应字段赋值后保存。
3.保存部门的时候,对于外键,emp表是主动增加了一个叫做emp_id的字段,所以要使用emp.dept_id = dept
,将获取到的dept(id)传给emp的dept_id字段。
html文件
<tr>
<td valign="middle" align="right">所在部门</td>
<td>
<select class="form-control" id="dept" name="dept">
<option selected="" name="sdept">选择所在部门</option>
{% for i in deptlist.values %}
<option value="{{ i.id }}" name="sdept">{{ i.deptname }}</option>
{% endfor %}
</select>
</td>
</tr>
说明:下拉单选菜单使用select,option
,使用for循环从deptlist中取部门的值展示出来。所以是{% for i in deptlist.values %}
,注意显示的字段使用deptname,对应value使用id来用来存储在数据表中。
网友评论