2017-07-12 12 views
0

モデルに直接対応していないフィールドがいくつかあるmodelFormがある場合、フォームをカスタム方法で処理するにはどうすればいいですか?残りのフィールドはデフォルトで保存しますか?Djangoフォームのカスタムフィールド

たとえば、多言語の記述に対応するモデルのモデルがあります。モデルは以下のとおりです。

class Item(models.Model): 
    name = models.ForeignKey(Localization) 
    on_sale = models.BooleanField(default=False) 

class Localization(models.Model): 
    de = models.TextField(blank=True, null=True, verbose_name='de') 
    eng = models.TextField(blank=True, null=True, verbose_name='eng') 

/編集項目を追加するためのフォームは以下のようになります。

class ItemForm(forms.ModelForm): 
    id = forms.CharField(widget=forms.HiddenInput(), max_length=128, label='') 
    name_eng = forms.CharField(widget=forms.TextInput(attrs={'style': 'width:200px;'}), label='eng') 
    name_de = forms.CharField(widget=forms.TextInput(attrs={'style': 'width:200px;'}), label='de') 
    on_sale = forms.CharField(widget=forms.CheckboxInput(), label='on_sale',) 

    class Meta: 
     model = Item 
     fields = ('id', 'on_sale',) 

今何このフォームを保存すると、新しいアイテムのされないはずです - 2でローカライズオブジェクトを作成しますLocalizationオブジェクトにリンクされたon_saleフィールドを持つItemオブジェクトを作成します。既存のItemの場合、対応するLocalizationオブジェクトを編集してから、Item自体のon_saleフィールドを編集します。

個別の機能を持つタスクを実行しましたが、要求のカスタムフィールドを別々に処理しますが、フォームのsave()メソッドですべての処理を行うと、よりよく見えます。または私は間違っていますか?

PS明らかに着用された質問をして申し訳ありませんが、私は他の例で私が欲しいものをやり遂げることができません。

更新:

私は実際にそれは私がここからヒントの助けを借りたかった道を働いてしまいました。コードはそのままで、最適化できるかどうか教えてください。

class NameForm(forms.ModelForm): 
    # id = forms.CharField(widget=forms.HiddenInput(), max_length=128, label='') 
    id = forms.CharField(widget=forms.TextInput(attrs={'style': 'width:200px;'}), label='id', required=False) 
    name_eng = forms.CharField(widget=forms.TextInput(attrs={'style': 'width:200px;'}), label='eng') 
    name_de = forms.CharField(widget=forms.TextInput(attrs={'style': 'width:200px;'}), label='de') 
    gender = forms.CharField(widget=forms.CheckboxInput(), label='gender', required=False) 

    class Meta: 
     model = Name 
     fields = ('id', 'gender',) 

    def save(self): 
     instance = super(NameForm, self).save(commit=False) 
     obj_id = self.cleaned_data['id'] 
     if obj_id: 
      instance_bd = Name.objects.get(pk=obj_id) 
      loc = instance_bd.name 
      loc.de = self.cleaned_data['name_de'] 
      loc.eng = self.cleaned_data['name_eng'] 
      loc.save() 
      instance.id = obj_id 
     else: 
      loc = Localization(de=self.cleaned_data['name_de'], eng=self.cleaned_data['name_eng']) 
      loc.save() 
     instance.name = loc 
     instance.save() 
     return instance 

ビューは、より良いforms'saveメソッドを使用していない。この場合、単に

@login_required 
def admin_lists(request): 
    if request.method == 'POST': 
     form = NameForm(request.POST) 
     if form.is_valid(): 
      form.save() 
    forms = {'name': NameForm()} 
    return render(request, 'admin/lists.html', {'forms': forms}) 
+1

あなたが探しているのは 'commit = false'です。 views.pyでフォームの検証を行います。こちらをご覧くださいhttps://stackoverflow.com/questions/12848605/django-modelform-what-is-savecommit-false-used-forあなたのviews.pyを投稿すると、おそらく私はあなたが何を意味するかを示すことができます。 – hansTheFranz

+0

@hansTheFranzありがとうございました。私は実際に、私が望むように、上記のコードを動作させました。可能な改善があれば教えてください。 –

答えて

0

で、私は最後の部分を理解していなかったこの

if request.method == 'POST': 
    form = ItemForm(request.POST) 
    # check whether it's valid: 
    if form.is_valid(): 
     post = request.POST 
     set_name_eng= post['name_eng'] 
     set_name_de= post['name_de'] 
     set_on_sale = post['on_sale'] 

     #now here we create the anothers objects 
     a = Localization(de=set_name_de, eng=set_name_eng) 
     a.save() 

     b = Item(name=a, on_sale=sale) 
     b.save() 

を試してみてくださいあなたのモデルやフォームを整理する必要があると思います。私に教えてください。私はあなたを助けようとします。

+0

コメントありがとうございます。なぜこのメソッドは、フォームのsave()でそれを行うより良いですか? –

+0

この場合、モデルフォームだけでなく、他のモデルのデータも変更する必要があります。例えば、modelformは非常に便利なsave()であり、両方のメソッドを.save(commit = False) –

関連する問題