4

ジャンゴ: 1.4.1

モデル:

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」ボタンを送信すると、フォームセットが正しい追加フィールド 1 を取得していることがわかりますが、Web ページではデータベースの行だけが表示されます。これはバグですか、それとも何か間違っていますか?

4

1 に答える 1

2

フォームセット ファクトリは、管理フォームから、パラメータまたはパラメータ(またはデータ)のいずれかによってmax_num、フォームの数を見つけます。extraform-TOTAL_FORMSrequest.POST

あなたの場合、request.POST['form-TOTAL_FORMS']余分なフォームを含まない番号があります。そのため、フォームセットを作成するときに余分なフォームを追加しません。

1 つの解決策は、条件が満たされたときにこの数値を 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)
....

ただし、この方法でフォームセットを操作することにはいくつかの欠点があります。フォームセットを検証すると、必須フィールドがある場合、追加のフォームにエラーが表示されます。

より良い解決策は、1 つの追加のフォームとクエリセットでテンプレートを渡す前に、フォームセットを再度作成することです。ほとんどの場合、フォームセットが有効な場合、新しいオブジェクトを保存すると、クエリセットによって追加されます。したがって、ページには、新しく追加されたオブジェクトと 1 つの追加フォームが表示されます。

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))
于 2012-10-18T09:21:46.123 に答える