1

管理者が「保存して別のものを追加」したときに、選択された値が変更されないように、django管理者のフィールド(この場合は「イベント」フィールド)の選択を永続化したいと考えています。これがデフォルトの django の動作であるかどうかはわかりません。いずれにせよ、フォームをオーバーライドして、カスタム フィルタリング/エラー チェックを行いました。ビュー/テンプレートにも触れたくありません。私の最初の計画は、選択した値をセッションに保存し、フォームの初期化時にそれを取得することでしたが、リクエスト オブジェクトを ScoreAdmin フォームに渡す方法が見つかりませんでした。

次に何をすべきかについて何か提案はありますか?

私がこれまでに持っているもの

class ScoreForm(forms.ModelForm):
def __init__(self, *args, **kwargs):

    super(ScoreForm, self).__init__(*args, **kwargs)
    self.request = kwargs.pop('request', None)

    standard_events = Event.objects.filter(event_score_type='STD')
    event_widget = self.fields['event'].widget

    choices = []
    for element in standard_events:
        choices.append((element.id, element.name))
    event_widget.choices = choices

def clean_score(self):
    print self.request.session
    print(self.cleaned_data['event'])
    selected_event = Event.objects.get(name=self.cleaned_data['event'])
    if(selected_event.max_score > selected_event.min_score):
        if self.cleaned_data['score'] < 0:
            raise forms.ValidationError("Score Cannot Be Negative")
        elif self.cleaned_data['score'] > selected_event.max_score:
            raise forms.ValidationError("Score Cannot Be Greater Than Best Possible Score of " + str(selected_event.max_score))
        elif self.cleaned_data['score'] < selected_event.min_score:
            raise forms.ValidationError("Score Cannot Be Less Than Worst Possible Score of " + str(selected_event.min_score))
        else:
            return self.cleaned_data['score']
    elif selected_event.max_score < selected_event.min_score:
        if self.cleaned_data['score'] < 0:
            raise forms.ValidationError("Score Cannot Be Negative")
        elif self.cleaned_data['score'] < selected_event.max_score:
            raise forms.ValidationError("Score Cannot Be Less Than Best Possible Score of " + str(selected_event.max_score))
        elif self.cleaned_data['score'] > selected_event.min_score:
            raise forms.ValidationError("Score Cannot Be Greater Than Worst Possible Score of " + str(selected_event.min_score))
        else:
            return self.cleaned_data['score']
    class Meta:
        model = Score


class ScoreAdmin(admin.ModelAdmin):
    form = ScoreForm
    pass

スクリーンショット

追加の間に「イベント」フィールドを保持したい

4

1 に答える 1

1

存在するセッション変数がある場合、フォーム内の Event ノードの値をオーバーライドします。以下のようなものですが、if でラップされています。モデルの情報がないと具体的な内容を特定するのは困難ですが、これで大まかなアイデアが得られるはずです。

class ScoreForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(ScoreForm, self).__init__(*args, **kwargs) # call the parent init
        self.initial['Event'] = self.get_my_session_var

主にこの投稿の情報から: How to override field value display in Django admin change form

于 2013-01-18T21:28:46.473 に答える