【问题标题】:Update database instance with specific form fields using Django (modify_personal_info)使用 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>

【问题讨论】:

    标签: django forms django-views django-templates


    【解决方案1】:

    您好,您使用这些行来更新 Django 模型对象

    user = Account(first_name=form.get('first_name'))
    user.save()
    

    但它实际上是这样的: 创建一个内存对象,并在调用 save 后将该对象转到数据库。

    可以修复您的代码,但重复性太高,满足您的要求的更好方法是:

    1. 在获取请求中,使用实例创建表单(使用 Django 表单): from = AccountFrom(request.POST, instance=user)
    2. 检查表单是否有效: if form.is_valid():
    3. 最后保存表单: form.save()

    也可以自己做,比你的代码更好,但使用 django 特性 您可以从https://www.geeksforgeeks.org/django-modelform-create-form-from-models/了解更多关于 django 表单的信息

    【讨论】:

    • 您好,感谢您的回答。关于我使用的第一行,它们是从数据库中选择该用户实例,我仍然不愿意使用 django 表单,我将它们用于另一个功能,但样式就是不会坚持。无论如何,如果我使用 django 表单并使用 `form.save()` 会保存包含数据的字段,还是会用空/空数据覆盖其他字段?
    • 它们不再是空的,因为 Django 用所选对象的数据填充它们,并且在 UX 方面更好,因为用户可以在模型中看到以前的数据。当您调用 form.is_valid 时,Django 也会处理错误,您可以将它们显示给用户。
    • 谢谢您,您发送的链接非常简单且具有指导意义,而官方文档则有些混乱。
    猜你喜欢
    • 2018-01-15
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2010-12-21
    • 1970-01-01
    相关资源
    最近更新 更多