モデルに別のモデルへの 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
どんな助けでも本当に感謝します。前もって感謝します。