首页 文章

如何模仿django admin的OneToOneField可选表单

提问于
浏览
3

我想模仿Django管理站点在模型具有OneToOneField到另一个模型时提供的功能,其中填充OneToOne模型的表单是可选的 . 始终显示该字段的表单,但如果它为空,则不会创建OneToOneField的对象,只会创建或修改主对象 . 它还有一个删除复选框,仅在创建OneToOneField对象时激活 . 如果选中并且您点击了save,则会删除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

我真的很感激任何帮助 . 提前致谢 .

1 回答

  • 1

    您需要更改一个小东西才能使代码完美运行 . 在发布表单并保存数据后,您应该重定向某个地方,而不是再次显示表单 . 更换:

    alerta = "Producto modificado exitosamente"
    

    有:

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

    (您可以使用 return redirect('pdv.views.productomodificar', prodcuto.id) 重定向回表单)

相关问题