【问题标题】:Pass initial value to a modelform in django将初始值传递给 django 中的模型表单
【发布时间】:2011-11-22 17:24:26
【问题描述】:

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

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()})

现在我想为 Person 类的一个字段传递一个初始值。我该怎么做?

【问题讨论】:

  • 您无法在管理员中实例化表单。 form = 部分必须是表单类而不是表单对象。
  • 但您可以将表单包装在工厂中
  • get_current_user() 从何而来?我不知道这个功能,在文档中找不到。

标签: django django-admin


【解决方案1】:

您可以像这样将初始值传递给 ModelForm:

form = PersonForm(initial={'fieldname': value})

例如,如果您想将初始age 设置为24 并将name 设置为"John Doe":

form = PersonForm(initial={'age': 24, 'name': 'John Doe'})

更新

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

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())

【讨论】:

  • 我也试过了,但出现以下错误。 issubclass() arg 1 必须是一个类
  • 你在哪里得到这个错误? issubclass() arg 1 must be class
  • admin.site.register(Person, PersonAdmin)
  • 澄清一下,在您的PersonAdmin 课程中,您是否在做`form = PersonForm(initial={'fieldname': value})?如果是这样,您要做的是使用默认值。
  • 实际上不,我想用一个动态值初始化,比如 initial = {'creator':current_user}。所以,当前用户是动态的,是从请求对象中获取的
【解决方案2】:

如果有人仍然想知道,以下可以为管理员表单设置初始值:

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

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

【讨论】:

    【解决方案3】:

    由于您的 ModelForm 绑定到 Person-Model,您可以传递一个 Person-Instance:

    form = PersonForm(instance=Person.objects.get(foo=bar)
    

    或覆盖 ModelForm 的 init 方法:

    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']
    

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

    【讨论】:

    • 我也重写了 init 方法。但是,当我尝试在初始化表单时传递初始参数时,它仍然会引发相同的错误
    • 不,我的意思是在我的模型中我做了同样的事情,覆盖了 init 方法并且它抛出了错误
    • 现在应该是 self.fields['foo'].value = 'bar' ⇒ self.fields['foo'].initial = 'bar'
    猜你喜欢
    • 2010-12-25
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    相关资源
    最近更新 更多