web-dev-qa-db-ja.com

初期パラメータをDjangoのModelFormインスタンスに渡す方法は?

私が持っている特定のケースは次のようなものです:

fromto(どちらもForeignKeysからauth.Userモデル)およびamountのフィールドを持つトランザクションモデルがあります。私のフォームでは、入力する2つのフィールドをユーザーに提示したいと思います:amountfromtoはビュー機能で現在のユーザーに自動的に設定されます) 。

ForeignKeyを表示するデフォルトのウィジェットは選択ボックスです。しかし、私がそこに到達したいのは、選択肢をuser.peersクエリセットメンバーのみに制限することです(したがって、人々はピアとのトランザクションのみを登録でき、すべてのシステムユーザーで溢れることはありません)。

ModelFormを次のようなものに変更しようとしました。

class AddTransaction(forms.ModelForm):
  from = ModelChoiceField(user.peers)
  amount = forms.CharField(label = 'How much?')

  class Meta:
    model = models.Transaction

しかし、ここでModelChoiceFieldの選択肢のクエリセットを渡す必要があるようです。Webのrequest.userオブジェクトにアクセスできません。

フォームの選択肢をユーザーに依存するものに制限するにはどうすればよいですか?

20
kender

次の方法を使用します(うまくいけば、それは十分に明確です):

class BackupForm(ModelForm):
    """Form for adding and editing backups."""

    def __init__(self, *args, **kwargs):
        systemid = kwargs.pop('systemid')
        super(BackupForm, self).__init__(*args, **kwargs)
        self.fields['units'] = forms.ModelMultipleChoiceField(
                required=False,
                queryset=Unit.objects.filter(system__id=systemid),
                widget=forms.SelectMultiple(attrs={'title': _("Add unit")}))

    class Meta:
        model = Backup
        exclude = ('system',)

次のようなフォームを作成します。

form_backup = BackupForm(request.POST,
                         instance=Backup,
                         systemid=system.id)
form_backup = BackupForm(initial=form_backup_defaults,
                         systemid=system.id)

お役に立てば幸いです。もっと詳しく説明する必要がある場合はお知らせください。

31
lemonad

私もこの問題に遭遇しました、そしてこれは私の解決策でした:

class ChangeEmailForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        self.user = user
        super(ChangeEmailForm, self).__init__(*args, **kwargs)
        self.fields['email'].initial = user.email

    class Meta:
        model = User
        fields = ('email',)

    def save(self, commit=True):
        self.user.email = self.cleaned_data['email']
        if commit:
            self.user.save()
        return self.user
6
Druska

http://www.djangobook.com/en/2.0/chapter07/ のセクション初期値の設定では、その方法について説明しています。 initialパラメーターをFormコンストラクターに使用します。派生したForm__init__メソッドで追加の作業を行うこともできます。

1
Rasmus Kaj

ユーザーをフォームの___init___に渡し、super(…)を呼び出します。次に、_self.fields['from'].queryset_を_user.peers_に設定します

0
Rory