手动呈现的表单字段不保存数据
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
code
@AhmetNecipArslan 您仍然没有呈现错误,您确定您的表单有效吗?以上是关于手动呈现的表单字段不保存数据的主要内容,如果未能解决你的问题,请参考以下文章