我想模仿一个模型在另一个模型中具有OneToOneField的情况下Django Admin站点提供的功能,在该模型中,可以选择为OneToOne模型填写表单。该字段的表单始终显示,但是如果为空,则不创建OneToOneField的对象,仅创建或修改主对象。它还具有一个删除复选框,只有在创建OneToOneField对象时才激活该复选框。如果选中并单击保存,则将删除OneToOne对象,但保留主对象。
涉及的模型:一种是产品,另一种是产品的额外信息(如果碰巧是啤酒):
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管理员中如何工作的示例:
在添加可选的onetoone对象之前:http://i.imgur.com/p3P6s.png
创建可选的onetoone对象之后:http://i.imgur.com/UEcm8.png
我将非常感谢您的帮助。提前致谢。
最佳答案
您需要更改一件事以使您的代码完美运行。发布表单并保存数据后,应重定向到某处,而不是再次显示该表单。更换:
alerta = "Producto modificado exitosamente"
与:
from django.shortcuts import redirect
return redirect('my_view')
(您可以使用
return redirect('pdv.views.productomodificar', prodcuto.id)
重定向回表单)