Vic*_*tor 5 django django-forms
我有一个模型的表单,它有两个字段:field_A和field_B.我想要:
我尝试过的:
field_A = forms.CharField(required=True)
field_B = forms.CharField(required=False)
def save(self, *args, **kwargs):
     """
     Overriding save, so call the parent form save and return the new_user
     object.
     """
     self.data["field_B"] = self.data["field_A"]
     self.cleaned_data["username"] = self.cleaned_data["email"]
     super(MyParentClass*, self).save(*args, **kwargs) 
Run Code Online (Sandbox Code Playgroud)
*这两个字段都是从ParentClass继承的,它们是必需的
这是一个适合我的解决方案.
# models.py
class MyModel(models.Model):
    field_A = models.CharField(max_length = 255)
    field_B = models.CharField(max_length = 255)
    def __unicode__(self):
        return "%s: %s, %s" % (self.pk, self.field_A, self.field_B)
# forms.py
class MyModelForm(ModelForm):
    class Meta:
        model = MyModel
        exclude = ('field_B',)
    def save(self, *args, **kwargs):
        commit = kwargs.pop('commit', True)
        instance = super(MyModelForm, self).save(*args, commit = False, **kwargs)
        instance.field_B = self.cleaned_data['field_A']
        if commit:
            instance.save()
        return instance
Run Code Online (Sandbox Code Playgroud)
表格的说明 Meta
exclude = ('field_B',)
Run Code Online (Sandbox Code Playgroud)
确保满足您的第一个条件.当向用户field_A显示表单时,仅显示.第二个条件在重写save()方法中得到解决.
解释 save()
commit = kwargs.pop('commit', True)
Run Code Online (Sandbox Code Playgroud)
commit如果提供,则提取关键字参数.
instance = super(MyModelForm, self).save(*args, commit = False, **kwargs)
Run Code Online (Sandbox Code Playgroud)
创建基础模型的实例.显式传递commit=False以确保此实例尚未保存到数据库.
instance.field_B = self.cleaned_data['field_A']
Run Code Online (Sandbox Code Playgroud)
将field_Afrom 的值分配cleaned_data给实例field_B.请记住,form.is_valid()在此之前你应该打过电话.否则就没有了cleaned_data.
        if commit:
            instance.save()
Run Code Online (Sandbox Code Playgroud)
如果用户希望将实例保存到数据库,则执行此操作.
return instance
Run Code Online (Sandbox Code Playgroud)
最后,返回实例.
样本用法
In [1]: from app.forms import MyModelForm
In [2]: f = MyModelForm(data = {'field_A': 'Value A'})
In [3]: f.is_valid()
Out[3]: True
In [4]: f.save()
Out[4]: <MyModel: 3: Value A, Value A>
In [5]: f = MyModelForm(data = {'field_A': 'VA'})
In [6]: f.is_valid()
Out[6]: True
In [7]: f.save(commit = False)
Out[7]: <MyModel: None: VA, VA>
In [8]: 
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           4555 次  |  
        
|   最近记录:  |