django 在一个视图中保存多个表单

von4xj4u  于 2023-03-13  发布在  Go
关注(0)|答案(1)|浏览(129)

我有以下关系模型:

class Anuncio(models.Model):
    anunciante = models.ForeignKey(User, verbose_name=_("anunciante"), on_delete=models.CASCADE, null=True)
    titulo = models.CharField(_("titulo del anuncio"), max_length=50)

class Producto(models.Model):
    nombre = models.CharField(_("nombre del producto"), max_length=50)
    anuncio = models.ForeignKey(Anuncio, on_delete=models.CASCADE, related_name='products', blank=True, null=True)

class Imagen(models.Model):
    producto = models.ForeignKey(Producto, on_delete=models.CASCADE, related_name='imagen', blank=True, null=True)
    imagen = models.ImageField(upload_to='marketplace/')

我有一个表单,它允许添加具有适当关系的所有三个模型的示例。这工作正常,但我尝试添加一个特性,将额外的ProductoImagen示例添加到同一个Anuncio。我用JavaScript渲染额外的表单,渲染结果正常。但是我无法保存其他表单的数据。这是Anuncio的主创建视图:

def anunciocreateview(request):
    if request.method == "POST":
        anuncio_form = AnuncioForm(request.POST or None)
        producto_form = ProductoForm(request.POST or None)
        imagen_form = ImagenForm(request.POST, request.FILES)
        if all([anuncio_form.is_valid(), producto_form.is_valid(), imagen_form.is_valid()]):
            anuncio = anuncio_form.save(commit=False)
            anuncio.anunciante = request.user
            anuncio.save()
            producto = producto_form.save(commit=False)
            producto.anuncio = anuncio
            producto.save()
            imagen = request.FILES.get('imagen')
            if imagen:
                Imagen.objects.create(producto=producto, imagen=imagen)
            return HttpResponse(status=204, headers={'HX-Trigger' : 'eventsListChanged'})
        else:
            print(anuncio_form.errors)
            print(producto_form.errors)
            print(imagen_form.errors)
    else:
        anuncio_form = AnuncioForm()
        producto_form = ProductoForm()
        imagen_form = ImagenForm()
    context = {
        'anuncio_form' : anuncio_form,
        'producto_form' : producto_form,
        'imagen_form' : imagen_form
    }
    return render(request, 'buyandsell/formulario.html', context)

这是关于附加的仅ProductoImagen表单的视图:

def create_product(request):
    if request.method == "POST":
        producto_form = ProductoForm(request.POST or None)
        imagen_form = ImagenForm(request.POST, request.FILES)
        if all([producto_form.is_valid(), imagen_form.is_valid()]):
            producto = producto_form.save()
            imagen = request.FILES.get('imagen')
            if imagen:
                Imagen.objects.create(producto=producto, imagen=imagen)
            return HttpResponse("Product added.")
    else:
        producto_form = ProductoForm()
        imagen_form = ImagenForm()
    context = {
        'producto_form' : producto_form,
        'imagen_form' : imagen_form
    }
    return render(request, 'buyandsell/partials/producto-form.html', context)

第一个视图保存了数据,但是附加的表单没有保存。我也试过查看表单集,但是我也没有弄清楚如何才能完成这样的任务。

xeufq47z

xeufq47z1#

你可以使用formset来完成这个任务。要了解更多信息,你可以在这里查看Django关于表单集的文档:Formsets in Django

相关问题