在 Form Meta 类中设置初始值

Posted

技术标签:

【中文标题】在 Form Meta 类中设置初始值【英文标题】:Setting initial values in Form Meta class 【发布时间】:2014-05-15 20:25:41 【问题描述】:

假设我有以下模型:

class Example(models.Model):
    name = models.CharField(max_length=40)

我希望它的表单具有字段“名称”的初始值,所以它可以是:

class ExampleForm(forms.ModelForm):
   name = forms.CharField(initial="initial_name")

这对于这个简单的示例来说已经足够了,但如果我有更复杂的 ModelFields(即带有覆盖的小部件),我在使用基本的 forms.CharField 重新分配字段“名称”时会丢失所有内容。

我的问题:有没有办法在 Meta 类中设置首字母,就像小部件一样?类似...

 class ExampleForm(forms.ModelForm):
     class Meta:
         initials = 
             'name': 'initial_name',
         

【问题讨论】:

【参考方案1】:

这些是我要检查的选项:

选项 1:在实例化表单时提供初始表单数据。

这是最基本的方法。在您的 views.py 中,只需使用 initial 关键字参数提供数据。

views.py

from forms import ExampleForm

INITIAL_DATA = 'name': 'initial_name'

def my_view(request):
    ...
    form = ExampleForm(initial=INITIAL_DATA)
    ...

不太难。唯一的缺点是如果您使用和滥用该表单并且厌倦了传递初始数据。

选项 2(适合您的情况):在类的 __init__ 方法中提供初始数据。

Django 中的表单旨在在实例化时接受初始数据,因此您可以在 __init__ 方法中处理这些值。未经测试,这是我想象的样子:

forms.py

class ExampleForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        """If no initial data, provide some defaults."""
        initial = kwargs.get('initial', )
        initial['name'] = 'initial_name'
        kwargs['initial'] = initial
        super(ExampleForm, self).__init__(*args, **kwargs)

这将是最佳选择,因为您可以忽略视图代码中的initial=...

【讨论】:

以上是关于在 Form Meta 类中设置初始值的主要内容,如果未能解决你的问题,请参考以下文章

Django 在表单中设置初始数据

如何在 Golang 中设置文本输入的初始值?

在Jquery Datepicker中设置日期的初始值[重复]

在类中设置默认值

如何在 Vuetify DataTable 组件中设置初始“每页行数”值?

无法在 Chrome 中设置 type="time" 的输入元素的初始值