modelformset_factory不接受额外的参数

Django的:1.4.1modelformset_factory不接受额外的参数

型号:

class Hoja(models.Model): 

nombre = models.CharField(max_length=200) # requerido

class Linea(models.Model):

hoja = models.ForeignKey(Hoja) # requerido

nombre = models.CharField(max_length=200) # requerido

padre = models.ForeignKey('self', null=True, blank=True, related_name='hijo')

查看:

lineas = Linea.objects.filter(hoja=alt).order_by('id') 

LineaHojaSet = modelformset_factory(Linea, can_delete=True, extra=1 if request.POST.has_key('siguiente') else 0)

formset = LineaHojaSet(request.POST or None, queryset=lineas)

if request.method=='POST':

# process formset

return render_to_response('template.html', {'formset':formset}, context_instance=RequestContext(request))

模板:

<table> 

<thead>

<tr><th>Nombre</th><th>Borrar</th></tr>

</thead>

<tbody>

{% for fs in formset %}

<tr>

<td>{{ fs.nombre }}</td>

<td>{{ fs.id }}</td>

</tr>

{% endfor %}

</tbody>

</table>

<input type="submit" name="siguiente" value="Añadir siguiente" />

当我提交了“ siguiente“按钮,我可以看到比f ormset正在获得正确的额外字段1,但在网页中,唯一显示的数据行是数据库字段。这是一个错误,或者我做错了什么?

回答:

Formset工厂通过max_num,extra参数或form-TOTAL_FORMS参数中的request.POST(或数据)查找来自管理窗体的表单数量。

在你的情况下,request.POST['form-TOTAL_FORMS']的号码不包括额外的形式。所以在创建formset时不会添加额外的表单。

解决方案之一就是在符合条件时将此数字加1。例如

data = None 

if request.POST:

data = request.POST.copy() #required as request.POST is immutable

if request.POST.has_key('siguiente'):

data['form-TOTAL_FORMS'] = int(data['form-TOTAL_FORMS']) + 1

#now use data instead of request.POST

formset = LineaHojaSet(data, queryset=lineas)

....

但是,以这种方式操作formset存在一些缺点。当您验证formset时,如果有任何必填字段,额外的表单将显示错误。

更好的解决方案是在将模板传递给一个额外的表单和查询集之前再次创建formset。最有可能的情况是,当formset有效时,您将保存任何新对象,这些对象将被queryset添加。所以你的页面会显示新添加的对象和一个额外的表单。

lineas = Linea.objects.filter(hoja=alt).order_by('id') 

LineaHojaSet = modelformset_factory(Linea, can_delete=True,)

formset = LineaHojaSet(request.POST or None, queryset=lineas)

if request.method=='POST':

# process formset

if formset.is_valid:

#saved and done with formset.

if request.POST.has_key('siguiente'):

LineaHojaSet = modelformset_factory(Linea, can_delete=True, extra=1)

formset = LineaHojaSet(queryset=lineas)

...

return render_to_response('template.html', {'formset':formset}, context_instance=RequestContext(request))

以上是 modelformset_factory不接受额外的参数 的全部内容, 来源链接: utcz.com/qa/263496.html

回到顶部