1

製品の追加と変更の両方を処理する 1 つのフォームがあります。製品を追加するときは、modifyAttribute フィールドを検証から除外したいのですが、製品を変更するときは、addAttributeフィールドを検証から除外したいと考えています

addAttributeフィールドに値を入力すると「追加モード」になり、 modifyAttributeフィールド (テキストボックス)に値を入力すると「変更モード」になります。

どうやってするか?どこ?ビューで?形?

4

3 に答える 3

0

次のように、フォーム__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', ...]
于 2013-07-20T09:20:40.887 に答える
0

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 つだけが存在することがわかっているためです。

于 2013-07-19T14:08:10.353 に答える