2016-10-10 24 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