在Form Meta类中设置初始值

时间:2014-04-03 19:35:06

标签: 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")

这个简单的例子很有用,但是如果我有更复杂的ModelFields(即有覆盖的小部件),我在重新分配字段时会错过所有的名字'使用基本的forms.CharField

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

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

1 个答案:

答案 0 :(得分:2)

这些是我要结帐的选项:

选项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={...}