2016-10-10 7 views
0

1つのFormFieldから複数のModelField値を抽出する必要があります。どこでこれを行うべきですか? clean_<field>の機能ですか? cleaned_data突然変異で?フォーム__init__は機能しますか? model.saveまたはform.saveで機能しますか?複数のmodelFieldを1つのFormfieldから計算する

モデル:

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

"1つのFormFieldから複数のModelField値を抽出する"とはどういう意味ですか?しかし、フォームに "normalize_name"が必要な場合は、フィールドタプルにも追加する必要があります....( 'name'、 'normalize_name'、...)... –

+0

ユーザーはhtml形式で 'name'と入力してください。モデルでは 'name'と' normalized_name'の両方が検証を必要とします。 'normalized_name'は' name'から計算して検証する必要があります。 – seyed

答えて

0

はあなたのコメントによると、私はsave()機能で何かをするだろう。

__init__(self)は、フォームにデータを入力する前に呼び出されるため、属性では何もできません。

理論的には、clean_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_namenameを使用して生成することを意味している場合とで、いくつかのものを行うことができますので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 
関連する問題