Django 在窗体元类中设置初始值
让我们假设我有以下型号:Django 在窗体元类中设置初始值,django,metaclass,form-fields,Django,Metaclass,Form Fields,让我们假设我有以下型号: class Example(models.Model): name = models.CharField(max_length=40) 我希望它的表单具有字段“name”的初始值,因此它可以是: class ExampleForm(forms.ModelForm): name = forms.CharField(initial="initial_name") 对于这个简单的例子来说,这很好,但如果我有更复杂的模型字段(即覆盖的小部件),我在用basic
class Example(models.Model):
name = models.CharField(max_length=40)
我希望它的表单具有字段“name”的初始值,因此它可以是:
class ExampleForm(forms.ModelForm):
name = forms.CharField(initial="initial_name")
对于这个简单的例子来说,这很好,但如果我有更复杂的模型字段(即覆盖的小部件),我在用basicforms.CharField
重新分配字段“name”时会丢失所有内容
我的问题:有没有一种方法可以像设置小部件一样,在元类中设置首字母?类似于
class ExampleForm(forms.ModelForm):
class Meta:
initials = {
'name': 'initial_name',
}
以下是我要签出的选项: 选项1:在实例化表单时提供初始表单数据。 这是最基本的方法。在views.py中,只需使用
initial
关键字参数提供数据
视图.py
from forms import ExampleForm
INITIAL_DATA = {'name': 'initial_name'}
def my_view(request):
...
form = ExampleForm(initial=INITIAL_DATA)
...
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)
不太棘手。唯一的缺点是,如果您使用和滥用该表单,并且厌倦了传递初始数据
选项2(非常适合您的情况):在类的\uuuu init\uuuu
方法中提供初始数据。
Django中的表单设计为在实例化时接受初始数据,因此可以在\uuuu init\uuu
方法中处理这些值。如果不进行测试,这就是我想象中的情况:
forms.py
from forms import ExampleForm
INITIAL_DATA = {'name': 'initial_name'}
def my_view(request):
...
form = ExampleForm(initial=INITIAL_DATA)
...
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={…}