私が持っている特定のケースは次のようなものです:
from
、to
(どちらもForeignKey
sからauth.User
モデル)およびamount
のフィールドを持つトランザクションモデルがあります。私のフォームでは、入力する2つのフィールドをユーザーに提示したいと思います:amount
とfrom
(to
はビュー機能で現在のユーザーに自動的に設定されます) 。
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
オブジェクトにアクセスできません。
フォームの選択肢をユーザーに依存するものに制限するにはどうすればよいですか?
次の方法を使用します(うまくいけば、それは十分に明確です):
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)
お役に立てば幸いです。もっと詳しく説明する必要がある場合はお知らせください。
私もこの問題に遭遇しました、そしてこれは私の解決策でした:
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
http://www.djangobook.com/en/2.0/chapter07/ のセクション初期値の設定では、その方法について説明しています。 initial
パラメーターをForm
コンストラクターに使用します。派生したForm
の__init__
メソッドで追加の作業を行うこともできます。
ユーザーをフォームの___init__
_に渡し、super(…)
を呼び出します。次に、_self.fields['from'].queryset
_を_user.peers
_に設定します