2

假设我有以下模型:

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

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

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

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

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

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

1 回答 1

2

这些是我要检查的选项:

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

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

视图.py

from forms import ExampleForm

INITIAL_DATA = {'name': 'initial_name'}

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

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

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

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

表格.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={...}视图代码中的 。

于 2014-04-03T20:51:25.110 回答