使用 Django (modify_personal_info) 更新具有特定表单字段的数据库实例
Posted
技术标签:
【中文标题】使用 Django (modify_personal_info) 更新具有特定表单字段的数据库实例【英文标题】:Update database instance with specific form fields using Django (modify_personal_info) 【发布时间】:2021-04-15 22:16:01 【问题描述】:我对 Django 很陌生,我正在做一个项目,我正在尝试创建一个页面来修改用户数据(代码如下)。我想要做的是允许用户更改一个或多个字段,不一定同时更改所有字段,然后更新用户实例,我尝试在每个字段上使用多个条件,所以我不会有稍后在数据库中的空字段,但没有任何反应。 这是相应的视图:
@login_required
def profile(request, id_user):
try:
user = Account.objects.get(pk=id_user)
if request.method == 'POST':
form= request.POST
if form.get('first_name'):
user = Account(first_name=form.get('first_name'))
user.save()
if form.get('last_name'):
user = Account(last_name=form.get('last_name'))
user.save()
if form.get('email'):
user = Account(email=form.get('email'))
user.save()
if form.get('username'):
user = Account(username=form.get('username'))
user.save()
if form.get('adress'):
user = Account(adress=form.get('adress'))
user.save()
if form.get('phone'):
user = Account(phone=form.get('phone'))
user.save()
except Account.DoesNotExist:
user = None
raise Http404("User does not exist")
return render(request, "profile.html")
这是来自模板的 sn-p:
<form action="#" method="POST">
% csrf_token %
<h6>Informations du compte</h6>
<div>
<div class="row">
<div class="col-lg-6">
<div >
<label for="username">Nom
d'utilisateur</label>
<input type="text" id="username"
class=""
placeholder="user.username">
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email"
class=""
placeholder="user.email">
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6">
<div >
<label for="first_name">Prénom</label>
<input type="text" id="first-name"
class=""
placeholder="user.first_name">
</div>
</div>
<div class="col-lg-6">
<div >
<label for="last_name">Nom</label>
<input type="text" id="last-name"
class=""
placeholder="user.last_name">
</div>
</div>
</div>
</div>
<hr class="my-4">
<h6>Informations de contact</h6>
<div>
<div class="row">
<div class="col-md-12">
<div >
<label for="adress">Adresse</label>
<input id="address" class=""
placeholder="user.adress" type="text">
</div>
</div>
</div>
<div class="row">
<div class="col-lg-4">
<div >
<label for="phone">Télephone</label>
<input type="text" id="phone"
class=""
placeholder="user.phone">
</div>
</div>
</div>
</div>
</div>
<div class="card-header bg-white border-0">
<div class="float-sm-right">
<div>
<button type="submit" value="appliquer"
class="btn btn-sm btn-primary">Appliquer</button>
</div>
</div>
</div>
</form>
【问题讨论】:
【参考方案1】:您好,您使用这些行来更新 Django 模型对象
user = Account(first_name=form.get('first_name'))
user.save()
但它实际上是这样的: 创建一个内存对象,并在调用 save 后将该对象转到数据库。
可以修复您的代码,但重复性太高,满足您的要求的更好方法是:
-
在获取请求中,使用实例创建表单(使用 Django 表单):
from = AccountFrom(request.POST, instance=user)
检查表单是否有效:
if form.is_valid():
最后保存表单:
form.save()
也可以自己做,比你的代码更好,但使用 django 特性 您可以从https://www.geeksforgeeks.org/django-modelform-create-form-from-models/了解更多关于 django 表单的信息
【讨论】:
您好,感谢您的回答。关于我使用的第一行,它们是从数据库中选择该用户实例,我仍然不愿意使用 django 表单,我将它们用于另一个功能,但样式就是不会坚持。无论如何,如果我使用 django 表单并使用 `form.save()` 会保存包含数据的字段,还是会用空/空数据覆盖其他字段? 它们不再是空的,因为 Django 用所选对象的数据填充它们,并且在 UX 方面更好,因为用户可以在模型中看到以前的数据。当您调用 form.is_valid 时,Django 也会处理错误,您可以将它们显示给用户。 谢谢您,您发送的链接非常简单且具有指导意义,而官方文档则有些混乱。以上是关于使用 Django (modify_personal_info) 更新具有特定表单字段的数据库实例的主要内容,如果未能解决你的问题,请参考以下文章