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")
对于这个简单的例子来说,这很好,但如果我有更复杂的模型字段(即覆盖的小部件),我在用basic
forms.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={…}