手动呈现的表单字段不保存数据

Posted

技术标签:

【中文标题】手动呈现的表单字段不保存数据【英文标题】:Manually rendered form fields do not save data 【发布时间】:2020-10-08 22:48:07 【问题描述】:

我真的很想自己解决这个问题,我在这个问题上花了 4 个多小时,但我现在放弃了。

我有一个应该保存数据的表单,如果我用 form 标签布置表单,一切都会很好。如果我使用 form.client_email 之类的单个标签输入表单,则表单数据不会保存到数据库中。

出于前端目的,我需要手动呈现这些字段,但我就是不知道该怎么做。 非常感谢您的帮助。

这是我的代码。

views.py

def client_list_view(request):
    if request.method == 'POST':
        form = ClientModelForm(request.POST)
        if form.is_valid():
            client_title = form.cleaned_data["client_title"]
            client_email = form.cleaned_data["client_email"]
            client_turkishid_no = form.cleaned_data["client_turkishid_no"]
            client_tax_no = form.cleaned_data["client_tax_no"]
            client_tax_office = form.cleaned_data["client_tax_office"]
            client_contactperson = form.cleaned_data["client_contactperson"]
            client_phone_number = form.cleaned_data["client_phone_number"]
            Client.objects.create(
                client_title=client_title,
                client_email=client_email,
                client_turkishid_no=client_turkishid_no,
                client_tax_no=client_tax_no,
                client_tax_office=client_tax_office,
                client_contactperson=client_contactperson,
                client_phone_number=client_phone_number
            ).save()
            return redirect("books:client-list")
    else:
        form = ClientModelForm()
    
    client_list = Client.objects.all().order_by("client_title")
    context = 'client_list' : client_list, "form": ClientModelForm
    return render(request, 'clients/client_list.html', context=context)

工作模板

<div id="clientModal" class="modal bottom-sheet">
    <div class="modal-content">
        <form method="POST">
            % csrf_token %
            form
            <button class="btn">Ekle</button>
        </form>
    </div> 
</div>

不工作的模板

<div id="clientModal" class="modal bottom-sheet">
    <div class="modal-content">
        <div class="row">
            <div class="col s12">
                 <ul class="tabs">
                    <li class="tab col m6"><a class="active" href="#gercek">Gerçek Kişi</a></li>
                    <li class="tab col m6"><a class="active" href="#tuzel">Tüzel Kişi</a></li>
                </ul>
        </div>
        <div id="gercek" class="col s12">
            <div class="col s12 m12 l12">
                <div id="inline-form" class="scrollspy">
                    <div class="card-content">
                        <form method="POST">
                        % csrf_token %
                            <div class="row">
                                <div class="input-field col m4 s12">
                                    <i class="material-icons prefix">email_outline</i>
                                    form.client_email
                                    <label for=" form.client_email.id_for_label ">Müvekkilin E-Posta Adresi</label>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>                
            </div>
        </div>
        <div id="tuzel" class="col s12">
            <div class="col s12 m12 l12">
                <div id="inline-form" class="scrollspy">
                    <div class="card-content">
                        <form method="POST">
                        % csrf_token %
                            <div class="row">
                                <div class="input-field col m4 s12">
                                    <i class="material-icons prefix">account_circle</i>
                                    form.client_title
                                    <label for=" form.client_title.id_for_label ">Müvekkilin Unvanı</label>
                                </div>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>                
            </div>            
        </div>
    </div> 

【问题讨论】:

【参考方案1】:

在您的“不工作”模板中,您使用表单标签包装每个单独呈现的字段。这不是做你需要的正确方法。只需像在工作模板中一样保留一个表单标签并在其中呈现所有字段:

<div id="clientModal" class="modal bottom-sheet">
    <div class="modal-content">
        <form method="POST">
            % csrf_token %


            <!-- put your fields here with any additional markup you need -->

             form.client_email 
            <label for=" form.client_email.id_for_label ">Müvekkilin E-Posta Adresi</label>

             form.client_title 
            <label for=" form.client_title.id_for_label ">Müvekkilin Unvanı</label>

            <!-- by the way you can use form.<field>.label_tag -->
             form.client_phone_number 
             form.client_phone_number.label_tag 

            <!-- and maybe you'd also like to render errors -->
             form.client_phone_number.errors 

            <button class="btn">Ekle</button>
        </form>
    </div> 
</div>

另外,ClientModelForm 似乎是 ModelForm 的一个实例,因此您不需要手动处理 form.cleaned_data。对于新对象,您只需调用 form.save(commit=True):

if form.is_valid():
    form.save(commit=True)

【讨论】:

感谢 clean_data 技巧,这部分有效。表格仍然不起作用。即使在工作模板中,如果我只是将 form 标签更改为 form.client_title ,帖子数据也会发送但未在数据库中注册。 @AhmetNecipArslan 显示您的实际代码,包括表单 code
% csrf_token % form.client_title
code
@AhmetNecipArslan 您仍然没有呈现错误,您确定您的表单有效吗?

以上是关于手动呈现的表单字段不保存数据的主要内容,如果未能解决你的问题,请参考以下文章

编辑表单正确回显之前保存的数据,但不更新表单字段

哈希被保存到数据库但无法在 Rails 表单中呈现其值?

php表单mysql更新保存数据

无法从 firebase 中的文本字段表单中保存数据

不使用 django 表单如何验证和保存表单数据

空formset传递验证但不保存记录