How to pass initial parameter to django's ModelForm instance?
The particular case I have is like this:
I have a Transaction model, with fields: from
, to
(both are ForeignKey
s to auth.User
model) and amount
. In my form, I'd like to present the user 2 fields to fill in: amount
and from
(to
will be automaticly set to current user in a view function).
Default widget to present a ForeignKey
is a select-box. But what I want to get there, is limit the choices to the user.peers
queryset members only (so people can only register transactions with their peers and don't get flooded with all system users).
I tried to change the ModelForm to something like this:
class AddTransaction(forms.ModelForm):
from = ModelChoiceField(user.peers)
amount = forms.CharField(label = 'How much?')
c开发者_StackOverflow社区lass Meta:
model = models.Transaction
But it seems I have to pass the queryset of choices for ModelChoiceField
right here - where I don't have an access to the web request.user
object.
How can I limit the choices in a form to the user-dependent ones?
Use the following method (hopefully it's clear enough):
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',)
Create forms like this:
form_backup = BackupForm(request.POST,
instance=Backup,
systemid=system.id)
form_backup = BackupForm(initial=form_backup_defaults,
systemid=system.id)
Hope that helps! Let me know if you need me to explain more in depth.
I ran into this problem as well, and this was my solution:
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
Pass the user into the __init__
of the form, and then call super(…)
. Then set self.fields['from'].queryset
to user.peers
精彩评论