[修改
由于我删除了new_method = ...和syspar.method.add()行(这是由method.save()处理的),我最初丢弃的解决方案变为DRY,因此它是完美的可以接受的。
我仍然认为设置self.fields [] .infial(根据pyriku的答案)只有在额外的>时才有用。 0,因为在单击“添加表单”按钮之前不希望显示表单的简单用例必须具有extra = 0,并且应该可以为新添加的表单设置初始值。
[ /修改
声明: 我已经查看了相关问题的许多答案,我只发现了一个有效的解决方案,但对我来说似乎很苛刻而且不是很干(4378667)/免责声明
我有一个modelformset,我将extra设置为0,因为我只想在用户按下“add_method”时显示一个新表单。一切正常,除了新添加的表单是空的(所需行为:它们包含我在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'] ='' 这太可怕了,因为:
我尝试this approach,也尝试设置初始值(正如其他一些相关问题的答案中所建议的那样),但都没有效果,两者都导致了非DRY代码。
必须有更好的方法来做到这一点......
答案 0 :(得分:0)
您可能需要覆盖该表单的__init__()
方法来设置所需的初始值。类似的东西:
def __init__(self, *args, **kwargs):
super(MethodForm, self).__init__(*args, **kwargs)
self.initial['field'] = 'value'