【问题标题】:Change form field value before saving保存前更改表单字段值
【发布时间】:2015-06-07 14:47:26
【问题描述】:

我有一个表格:

class ReferencesForm(forms.ModelForm):

    error_css_class = 'error'   #set some css when an error
    contactName = forms.CharField(label='Contact Name:')
    company = forms.CharField(label='Company:')
    address = forms.CharField(label='Address:')
    telephoneNumber = forms.CharField(label='Telephone Number:')

    class Meta:
        fields = '__all__'
        model = References

    def __init__(self, *arg, **kwarg):
        super(ReferencesForm, self).__init__(*arg, **kwarg)
        self.empty_permitted = True
    def clean(self):
        """ Custom validation for fields
        """
        cleaned_data = super(ReferencesForm, self).clean()

        return self.cleaned_data  

并像这样在我的视图文件中构建它:

ReferencesInlineFormSet = inlineformset_factory(
        Applicant, References, form=ReferencesForm, extra=1, can_delete=False)
...
if request.method == 'POST':
    references_formset = ReferencesInlineFormSet(
        request.POST, instance=applicant)

    if (references_formset.is_valid()):
        references_formset.instance['address'] = "test";
        references_formset.save();

我认为申请人模型在这里并不重要,但如果有必要我可以稍后添加。

我想将一些地址字段(addr1、addr2、城镇等)合并到一个名为“address”的数据库字段中,并且正在考虑在视图文件中这样做。

我在这里用“test”尝试了一个简单的分配,我收到了错误:

'Applicant' object does not support item assignment
references_formset.instance['address'] = "test"; 

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案1】:

    你可以这样使用:

    if form.is_valid():
        obj = form.save(commit=False)
        obj.address = "test"
        obj.save()
    

    【讨论】:

      【解决方案2】:

      简单:

      instance = form.instance
      instance.user = request.user
      instance.save()
      

      但要小心,这不会检查is_valid()。如果您想这样做,您可以使用新值实例化表单:

      # NOT TESTED, NOT SURE IF THIS WORKS...
      form = MyForm(instance=instance)
      if form.is_valid():
          form.save()
      

      【讨论】:

        【解决方案3】:

        您可以通过模型的实例访问表单的字段。例如。而不是这一行:

        references_formset.instance['address'] = "test";
        

        试试这条线:

        applicant.address = "test"
        

        【讨论】: