How can I pass an initial value for a field to a model form. I have something like the following code
class ScreeningForm(form开发者_如何学编程s.ModelForm):
class Meta:
model = Screening
def __init__(self, *args, **kwargs):
super(ScreeningForm, self).__init__(*args, **kwargs)
self.fields['blood_screen_type'] = CommaSeparatedCharField(
label=self.fields['blood_screen_type'].label,
initial=self.fields['blood_screen_type'].initial,
required=False,
widget=CommaSeparatedSelectMultiple(choices=BLOOD_SCREEN_TYPE_CHOICES)
)
class ScreeningAdmin(admin.ModelAdmin):
#form = ScreeningForm
form = ScreeningForm(initial={'log_user':get_current_user()})
Now I want to pass an initial value for a field of the Person class. How can I do that?
You can pass initial value to a ModelForm like this:
form = PersonForm(initial={'fieldname': value})
For example, if you wanted to set initial age
to 24
and name
to "John Doe"
:
form = PersonForm(initial={'age': 24, 'name': 'John Doe'})
Update
I think this addresses your actual question:
def my_form_factory(user_object):
class PersonForm(forms.ModelForm):
# however you define your form field, you can pass the initial here
log_user = models.ChoiceField(choices=SOME_CHOICES, initial=user_object)
...
return PersonForm
class PersonAdmin(admin.ModelAdmin):
form = my_form_factory(get_current_user())
In case anyone is still wondering, the following works to set initial values for an Admin form:
class PersonAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
form = super(PersonAdmin, self).get_form(request, obj=obj, **kwargs)
form.base_fields['log_user'].initial = get_current_user()
return form
Note that you can also set initial values via URL parameters: e.g. /admin/person/add?log_user=me
As your ModelForm is bound to the Person-Model, you could either pass a Person-Instance:
form = PersonForm(instance=Person.objects.get(foo=bar)
or overwrite the ModelForm's init-method:
class PersonForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(PersonForm, self).__init__(*args, **kwargs)
self.fields['foo'].value = 'bar'
class Meta:
model = Person
exclude = ['name']
This is untested. I'm not sure whether "value" is correct, I'm not having a Django-Installation here, but basically this is the way it works.
精彩评论