2016-10-10 60 views
0

我需要从一个FormField提取多个ModelField值。我应该怎么做?在clean_<field>的功能? cleaned_data突变?形式__init__功能?在model.saveform.save函数?从一个Formfield计算多个modelField

型号:

def normalize_name(name): 
    # some code 
    return name 

class MyModel(models.Model): 
    name   = models.CharField(max_length=250) 
    normalize_name = models.CharField(max_length=250, unique=True) 

形式:

class MyForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 
     fields = ('name',) # or normalize_name? or both? 
+0

我不确定“从一个FormField中提取多个ModelField值”是什么意思。但是,如果您希望在表单中包含“normalize_name”,则应该将其添加到字段元组中....('name','normalize_name',...) –

+0

用户只能以html格式输入“name” 。但在模型中'name'和'normalized_name'需要验证。 'normalized_name'必须从'name'计算出来,然后进行验证。 – seyed

回答

0

根据您的意见,我会做的东西在save()功能。

__init__(self)在将数据输入表单之前调用,因此它无法对属性执行任何操作。

理论上,clean_name可以工作(在我看来),但它应该用于验证。

name属性进行验证后,这样你就可以得到name和做一些东西与它(normalize_name(名称))

def save(self, user, *args, **kwargs): 
    name = self.cleaned_data['name'] 
    self.instance.normalized_name = normalize_name(name) 
    return super(YourFormClass, self).save(*args, **kwargs) 

如果你的意思是你产生normalized_name使用name和该save()方法被称为当normalized_name符合某些条件时,表单有效,在clean_name(self)内部执行。

def clean_name(self): 
    name = self.cleaned_data['name'] 
    normalized_name = normalize(name) 
    if not validate(normalized_name): 
     raise ValidationError("Something is wrong) 
    return name