モデルに直接対応していないフィールドがいくつかある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})
あなたが探しているのは 'commit = false'です。 views.pyでフォームの検証を行います。こちらをご覧くださいhttps://stackoverflow.com/questions/12848605/django-modelform-what-is-savecommit-false-used-forあなたのviews.pyを投稿すると、おそらく私はあなたが何を意味するかを示すことができます。 – hansTheFranz
@hansTheFranzありがとうございました。私は実際に、私が望むように、上記のコードを動作させました。可能な改善があれば教えてください。 –