3

モデルに別のモデルへの OneToOneField があり、OneToOne モデルのフォームへの入力がオプションである場合に、Django Admin サイトが提供する機能を模倣したいと思います。そのフィールドのフォームは常に表示されますが、空の場合、OneToOneField のオブジェクトは作成されず、メイン オブジェクトのみが作成または変更されます。また、OneToOneField オブジェクトが作成されたときにのみ有効になる削除チェックボックスもあります。チェックして保存すると、OneToOne オブジェクトは削除されますが、メイン オブジェクトは保持されます。

関連するモデル: 1 つは製品で、もう 1 つは製品がビールの場合の追加情報です。

class Producto(models.Model):
    nombre = models.CharField(max_length=100, blank=False)

class Cerveza(models.Model):
    producto = models.OneToOneField(Producto)

これは私がビューでやろうとしたことです:

def productomodificar(request, producto_id):
    from django.forms.models import inlineformset_factory
    from pdv.models import Producto, Cerveza
    from pdv.forms import ProductoForm, CervezaForm

    ProductoFormSet = inlineformset_factory(Producto, Cerveza, can_delete=True, form=CervezaForm)

    alerta = None
    producto = get_object_or_404(Producto, pk=producto_id)
    if request.user.is_staff:
        if request.method == 'POST':
            form = ProductoForm(request.POST, instance=producto)
            cervezaform = ProductoFormSet(request.POST, instance=producto)
            if form.is_valid():
                if cervezaform.is_valid():
                    form.save()
                    cervezaform.save()
                    alerta = "Producto modificado exitosamente"
                else:
                    alerta = "Error al modificar datos de cerveza"
            else:
                alerta = "Error al modificar producto"

        else:
            form = ProductoForm(instance=producto)
            cervezaform = ProductoFormSet(instance=producto)
            getm = request.GET.get('m', None)
            if getm == '1':
                alerta = "Producto creado exitosamente"
    else:
        alerta = "No tienes permiso para editar productos"
        form = producto
    c = {"user": request.user, "titulo": "Administrar Producto", "form": form, "cervezaform":cervezaform, "alerta":alerta}
    c.update(csrf(request))
    return render_to_response("productomodificar.html",c)

これらは私の関与するフォームです:

class ProductoForm(ModelForm):
    class Meta:
        from pdv.models import Producto
        model = Producto

class CervezaForm(ModelForm):
    class Meta:
        from pdv.models import Cerveza
        model = Cerveza

そして、これは私がテンプレートに両方のフォームを表示する方法です:

<form method="post" action="">{% csrf_token %}
    <table>
        {{ form.as_table }}
        {{ cervezaform.as_table }}
        <tr>
            <th></th>
            <td><input type="submit" value="Guardar" /></td>
        </tr>
    </table>
</form>

それでも問題は、OneToOne フォーム (Cerveza) に記入しないと製品を追加できないことです。したがって、空にすることはできません。また、OneToOne フォームを削除しようとすると、次のメッセージが表示されます。

(Hidden field id) Select a valid choice. That choice is not one of the available choices.

残念ながら、オプションの OneToOneField のフォームを作成し、それをカスタム テンプレートで使用する方法の良い例を見つけることができませんでした。

django admin での動作例を 2 つ紹介します。

オプションの onetoone オブジェクトを追加する前: http://i.imgur.com/p3P6s.png

オプションの onetoone オブジェクトを作成した後: http://i.imgur.com/UEcm8.png

どんな助けでも本当に感謝します。前もって感謝します。

4

1 に答える 1

1

コードを完全に機能させるには、小さなことを 1 つ変更する必要があります。フォームを POST してデータを保存したら、フォームを再度表示するのではなく、どこかにリダイレクトする必要があります。交換:

    alerta = "Producto modificado exitosamente"

と:

    from django.shortcuts import redirect
    return redirect('my_view')

( でフォームにリダイレクトできますreturn redirect('pdv.views.productomodificar', prodcuto.id))

于 2011-06-30T20:39:30.113 に答える