製品の追加と変更の両方を処理する 1 つのフォームがあります。製品を追加するときは、modifyAttribute フィールドを検証から除外したいのですが、製品を変更するときは、addAttributeフィールドを検証から除外したいと考えています。
addAttributeフィールドに値を入力すると「追加モード」になり、 modifyAttributeフィールド (テキストボックス)に値を入力すると「変更モード」になります。
どうやってするか?どこ?ビューで?形?
製品の追加と変更の両方を処理する 1 つのフォームがあります。製品を追加するときは、modifyAttribute フィールドを検証から除外したいのですが、製品を変更するときは、addAttributeフィールドを検証から除外したいと考えています。
addAttributeフィールドに値を入力すると「追加モード」になり、 modifyAttributeフィールド (テキストボックス)に値を入力すると「変更モード」になります。
どうやってするか?どこ?ビューで?形?
次のように、フォーム__init__
メソッドでフィールドを削除できます。ModelForm
class AddModifyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(AddModifyForm, self).__init__(*args, **kwargs)
if self.instance.pk:
del self.fields['modifyAttribute']
else:
del self.fields['addAttribute']
class Meta:
model = YourModel
fields = ['addAttribute', 'modifyAttribute', ...]
clean()
一度に複数のフィールドにアクセスする必要があるため、フォームのメソッドをオーバーライドすることをお勧めします。オブジェクトのディクショナリからクリーンな値にアクセスできるため、フィールドに検証を追加する方が簡単です。そのため、両方のフィールドが存在する場合はパスし、ケースに応じて適切と思われる例外を発生させたり、データを変更したりすることをお勧めします。関連ドキュメントはこちらself.cleaned_data
例:
class YourForm(forms.Form):
# Everything as before.
...
def clean(self):
cleaned_data = super(YourForm, self).clean()
add_attribute = cleaned_data.get("add_attribute")
modify_attribute = cleaned_data.get("modify_attribute")
if modify_attribute and add_attribute:
raise forms.ValidationError("You can't add and
modify a product at the same time.")
if not modify_attribue and not add_attribute:
raise forms.ValidationError("You must either add or modify a product.")
# Always return the full collection of cleaned data.
return cleaned_data
そして、ビューでは、modify_attribute の場合と add_attribute の場合に別のことを行うことができます。これで、そのうちの 1 つだけが存在することがわかっているためです。