【问题标题】:How to set initial values for new form in a (model)formset with extra=0如何在extra = 0的(模型)表单集中设置新表单的初始值
【发布时间】:2012-07-25 01:55:33
【问题描述】:

[编辑]

由于我删除了 new_method = ... 和 syspar.method.add() 行(这是由 method.save() 处理的),我最初丢弃的解决方案已经变成了 DRY,所以它是完美的可以接受。

我仍然认为设置 self.fields[].initial (根据 pyriku 的回答)仅在 extra > 0 时才有效,因为在简单的用例中,您不希望在“添加表单”之前显示表单' 按钮被点击,必须有 extra=0 并且应该可以为新添加的表单设置初始值。

[/edit]

免责声明: 我查看了许多相关问题的答案,但我只找到了一个可行的解决方案,但对我来说似乎很笨拙而且不是很干燥 (4378667)/Disclaimer

我有一个模型表单集,我将 extra 设置为 0,因为我只想在用户按下“add_method”时显示一个新表单。一切正常,除了新添加的表单是空的(期望的行为:它们包含我在方法表中设置的名称的默认值)

在models.py中:

class System(models.Model):
    method = models.ManyToManyField(Method)
    ...

class Method(models.Model):
    name = models.CharField()
    ...

在view.py中:

syspar = System.objects.get(id=sys_id)
MethodFormSet = modelformset_factory(Method, form=MethodForm, extra=0)
if request.POST:
    if 'add_method' in request.POST:
        new_method = Method.objects.create(name='whatever')
        syspar.method.add(new_method)

        post = request.POST.copy()
        post['method-TOTAL_FORMS'] = repr(int(post['method-TOTAL_FORMS'])+ 1)

        post['method-2-name'] = 'whatever' # code needed here to get actual value of -2-

        methodformset = MethodFormSet(data=post, prefix='method',
                queryset=Method.objects.filter(id__in=syspar.method.all()))

我的行有问题:post['method-2-name']='' 这很糟糕,因为:

  • 我已经在db表中设置了值
  • 我需要额外的 cruft 来确定每个案例的“2”值

我尝试了this approach,也尝试了设置初始值(如对其他一些相关问题的回答中所建议的那样),但都没有奏效,而且都导致了非 DRY 代码。

必须有更好的方法来做到这一点......

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    您可能需要覆盖该表单的__init__() 方法以设置所需的初始值。比如:

    def __init__(self, *args, **kwargs):
        super(MethodForm, self).__init__(*args, **kwargs)
        self.initial['field'] = 'value'
    

    【讨论】:

    • 我看不出它是如何工作的,因为ModelFormSet 实例(使用MethodForm)是在创建新的Method 对象之前创建的,那么__init__ 方法从哪里得到'value'
    • 我现在明白了——我在上面的代码中创建新方法的方式是错误的。设置 self.initial['field'] 不适用于这种情况。我完全重写了视图(使用 MethodForm 中的自定义 save() 方法,现在它 self.initial 可以工作了。
    • 糟糕 - 我太快将这个答案标记为正确。同时,我将 extra 设置为 1。现在我将 extra 设置回 0,设置初始值不再起作用...
    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    相关资源
    最近更新 更多