在提交模型表单之前保存字段值的正确方法是什么?
例如,我正在努力获得这个领域的名字'就像之前在表格中改变一样。我在下面这样做,但它确实有效,但我不确定这是否正确。
views.py:
if formset.is_valid():
for form in formset:
if form.has_changed and not form.empty_permitted:
cd = form.cleaned_data
new_fieldName = cd.get('name')
old_fieldName = str(cd.get('id'))
form.save()
有什么建议吗?
答案 0 :(得分:5)
formset.is_valid
会调用每个表单的is_valid
方法,而full_clean
方法会调用_post_update
,后者会调用instance
来更新表单。formset.is_valid
formset.is_valid
,其中包含随表单提交的值。在致电saved = {}
for form in formset.forms:
saved[form.instance.pk] = form.instance.__dict__.copy()
# or keep only specific fields
后,找到旧值的引用为时已晚;你有两个选择:
在调用save
之前,存储实例字段的副本:
original = form._meta.model.objects.get(pk=form.instance.pk)
# compare original against form.instance and observe differences
# save your form when you're ready:
form.save()
在调用{{1}}之前检索记录的新鲜实例:
{{1}}
答案 1 :(得分:1)
您还有pre_save()。我使用is_valid来验证对字段的任何错误或限制,并使用pre_save来自动化进程。
希望它有所帮助。