将初始值传递给django中的modelform

raj*_*pit 11 django django-admin

如何将字段的初始值传递给模型表单.我有类似下面的代码

class ScreeningForm(forms.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()})
Run Code Online (Sandbox Code Playgroud)

现在我想传递Person类的字段的初始值.我怎样才能做到这一点?

Der*_*wok 10

您可以将初始值传递给ModelForm,如下所示:

form = PersonForm(initial={'fieldname': value})
Run Code Online (Sandbox Code Playgroud)

例如,如果你想设置的初始age24name"John Doe":

form = PersonForm(initial={'age': 24, 'name': 'John Doe'})
Run Code Online (Sandbox Code Playgroud)

更新

我认为这可以解决您的实际问题:

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())
Run Code Online (Sandbox Code Playgroud)


SMX*_*SMX 8

如果有人仍然想知道,以下工作来设置管理员表单的初始值:

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
Run Code Online (Sandbox Code Playgroud)

请注意,您还可以通过URL参数设置初始值:例如/ admin/person/add?log_user = me


sch*_*eck 7

当您的ModelForm绑定到Person-Model时,您可以传递Person-Instance:

form = PersonForm(instance=Person.objects.get(foo=bar)
Run Code Online (Sandbox Code Playgroud)

或覆盖ModelForm的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']
Run Code Online (Sandbox Code Playgroud)

这是未经测试的.我不确定"值"是否正确,我在这里没有Django-Installation,但基本上这就是它的工作方式.

  • 现在应该是 `self.fields['foo'].value = 'bar'` ⇒ `self.fields['foo'].initial = 'bar'` (2认同)