使用 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) 更新具有特定表单字段的数据库实例的主要内容,如果未能解决你的问题,请参考以下文章

django使用已有的数据库表怎么建立model

Django web 开发 - Django的使用

Django-下载安装-配置-创建django项目-三板斧简单使用

使用Django返回helloworld

使用Django返回helloworld

使用Django返回helloworld