Django - 如何在保存之前检索表单字段的值?

时间:2014-03-11 12:19:50

标签: django django-forms django-views

在提交模型表单之前保存字段值的正确方法是什么?

例如,我正在努力获得这个领域的名字'就像之前在表格中改变一样。我在下面这样做,但它确实有效,但我不确定这是否正确。

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()

有什么建议吗?

2 个答案:

答案 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 后,找到旧值的引用为时已晚;你有两个选择:

  1. 在调用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()
    
  2. 在调用{{1}}之前检索记录的新鲜实例:

    {{1}}

答案 1 :(得分:1)

您还有pre_save()。我使用is_valid来验证对字段的任何错误或限制,并使用pre_save来自动化进程。

希望它有所帮助。