如何从数据库中获取数据并在表单中显示以更新内容
Posted
技术标签:
【中文标题】如何从数据库中获取数据并在表单中显示以更新内容【英文标题】:how to get data from database and display it in the form in order to update the content 【发布时间】:2019-11-30 04:01:01 【问题描述】:我有一个更新功能,允许用户使用 django 更新插入的记录。我试图根据 id 过滤对象。然后,一旦我返回 id,我假设我能够获取所有字段。
问题是当我去更新页面时,表单是空的,没有数据返回。
views.py
def update(request,pk):
#deny anonymouse user to enter the create page
if not request.user.is_authenticated:
return redirect("login")
else:
dbEntry = suspect.objects.filter(pk =pk)
print( "db entry : ",dbEntry)
return render(request,'blog/update.html', "dbEntry":dbEntry)
update.html
% extends "base.html" %
% load static %
% block body %
<head>
<link rel="stylesheet" type="text/css" href="% static '/css/linesAnimation.css' %">
<link rel="stylesheet" type="text/css" href="% static '/css/input-lineBorderBlue.css' %">
<link rel="stylesheet" type="text/css" href="% static '/css/dropDown.css' %">
<link rel="stylesheet" type="text/css" href="% static '/css/home.css' %">
<link rel="stylesheet" type="text/css" href="% static '/css/meta-Input.css' %">
<meta name= "viewport" content="width=device-width, initial-scale=1.0">
<script type="text/javascript" src="% static '/js/jquery-3.1.1.min.js'%"></script>
<title>Welcome</title>
</head>
<body>
<div class="lines">
<div class="line"></div><div class="line"></div>
<div class="line"></div><div class="line"></div>
<div class="line"></div><div class="line"></div><div class="line"></div>
</div>
<form enctype="multipart/form-data">
<div id='left-column-Input' class="formInput" include="select()">
<div class="forminputs">
<input type="text" id="fname" name="fname" autocomplete="off" required />
<label for="fname" class="label-name">
<span class="content-name" name="fname">dbEntry.suspect_name</span>
</label></div>
<div class="home-Button">
<button id="save" name="save" type="submit">Edit</button>
<button id="clear" name="clear" type="submit">Clear</button>
</div>
</div>
【问题讨论】:
如果你尝试dbEntry = suspect.objects.get(pk=pk)
而不是dbEntry = suspect.objects.filter(pk =pk)
会发生什么
【参考方案1】:
在 django 中,filter
返回与您的过滤器匹配的元素的 QuerySet。在您的情况下,您使用了filter
,因此您的dbEntry
是一个查询集。但是,如果您这样做,您需要在模板中使用for
循环才能访问对象字段。在您的情况下,您需要使用get
,它返回一个对象。您可以从official documentation 找到更多详细信息。
所以只要改变:
dbEntry = suspect.objects.filter(pk=pk)
到
dbEntry = suspect.objects.get(pk=pk)
使用get
时,您需要注意异常。如果没有找到对象,您的 get
调用将抛出 DoesNotExist
。类似地,如果您的 get
查询将在找到超过 1 个元素时抛出 MultipleObjectsReturn
异常。
什么时候用filter,什么时候用get?
这个问题没有严格的答案。当您想通过其唯一字段(例如主键)获取元素时,您可以使用get
,因为您确信您最多会获得一个对象或没有对象(如果不存在)。
如果您想获取对象列表(名为“Joe”的学生等),您需要使用filter
。这将返回一个 QuerySet,您可以通过在 django 模板中使用 for 循环来迭代该 QuerySet 来显示该列表的元素,例如:
% for obj in your_objects %
<tr><td> obj.name </td></tr>
% endfor %
【讨论】:
所以现在我可以获得与所选记录相关的所有字段吗?并且能够更新数据吗? 是的,通过使用get
,您将只有pk
及其所有字段的记录。
所以要使用 get 吗?以及何时使用过滤器?以上是关于如何从数据库中获取数据并在表单中显示以更新内容的主要内容,如果未能解决你的问题,请参考以下文章
如何从数据库中获取图像并在 laravel 中使用 ajax 以编辑形式预览它?
如何在滚动视图中显示从 Web 获取的 NSArray 数据并在 Objective C 中扩展+更新它?
获取 TableviewCells 以显示从 firebase 提取的不同数据并在 CollectionView 中显示它们
如何将出生日期从数据库显示到表单并在 php 和 PDO 中更新?