[英]Must the update form in Django update all fields of an object?
我在我的 Django 应用程序中创建了多个更新表单。
我的问题是:Django 是否需要更新对象的每个字段,或者有没有办法只更新实际更改的字段?
因此,例如,我可能有一个包含Airport Name
、 Airport City
、 Airport Country
的表单。 我可能会使用更新表单来更新Country
。 Django 是否还需要填写Name
和City
表单字段然后更新,或者有没有办法将它们留空而不更新数据库?
编辑
这是模型:
class Airport(models.Model):
airport_name = models.CharField(max_length=200, verbose_name="Aeroporto")
airport_city = models.CharField(max_length=200, verbose_name="Cidade")
airport_country = models.CharField(max_length=200, verbose_name="País")
和形式:
class UpdateAirport(ModelForm):
def __init__(self, *args, **kwargs):
super(UpdateAirport, self).__init__(*args, **kwargs)
self.fields['airport_name'].widget = TextInput(attrs={'class': 'form-control'})
self.fields['airport_city'].widget = TextInput(attrs={'class': 'form-control'})
self.fields['airport_country'].widget = TextInput(attrs={'class': 'form-control'})
class Meta:
model = Airport
fields = ('airport_name', 'airport_city', 'airport_country' )
而我的观点:
@login_required(login_url='../accounts/login/')
def airport_upd(request, id):
ts = Airport.objects.get(id=id)
if request.method == 'POST':
form = UpdateAirport(request.POST, instance=ts)
if form.is_valid():
form.save()
return redirect('flights')
else:
form = UpdateAirport(initial={'airport_name': ts.airport_name, 'airport_city': ts.airport_city, 'airport_country': ts.airport_country})
return render(request, 'backend/aiport_update.html', {'form': form, 'ts': ts})
我正在使用 Postgresql。
当您在Airport
表中创建新行时,字段不能为空或空白,因为是必需的,但是当您更新该行时,如果它们已经有值,则不需要填写所有字段
您可以通过覆盖现有的来编写自己的表单验证
def form_valid(self, form):
clean = form.cleaned_data
airport_name = clean.get('airport_name')
airport_city = clean.get('airport_city')
if airport_name:
form.instance.airport_name = airport_name
if airport_city:
form.instance.airport_city = airport_city
return super(UpdateAirport, self).form_valid(form)
确保这些字段不是必需的
使用UpdateView
子类,可以替换form_valid
方法。
def form_valid(self, form):
self.object = form.save( commit = False)
self.object.save( update_fields=['name', ... ]) # save only the specified fields
return HttpResponseRedirect(self.get_success_url())
无价参考: 经典 CBV
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.