【问题标题】:Setting initial values in Form Meta class在 Form Meta 类中设置初始值
【发布时间】: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',
         }

【问题讨论】:

    标签: django metaclass form-fields


    【解决方案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={...}

    【讨论】:

      猜你喜欢
      • 2019-07-11
      • 2012-06-20
      • 2018-12-25
      • 2019-10-13
      • 2017-10-24
      • 2019-12-15
      • 2016-07-17
      • 2019-03-01
      • 1970-01-01
      相关资源
      最近更新 更多