Django中[< class 'decimal. InvalidOperation'>]的InvalidOperation

fnx2tebb  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(137)

我正在Django中开发一个应用程序,当表单提交时,我遇到了这个错误:

我会把我的代码分享给你
这是我的模型:

class Oferta(models.Model):
    titulo = models.CharField(verbose_name='Título', max_length=100, null=False, blank=False)
    descripcion = models.TextField(verbose_name='Descripción', null=True, blank=True)
    cantidad = models.PositiveSmallIntegerField(verbose_name='Cantidad', null=False, blank=False, default=1)
    valor = models.DecimalField(verbose_name='Valor', max_digits=3, decimal_places=2, null=False, blank=False)
    material = models.CharField(verbose_name='Material', max_length=20, null=False, blank=False, choices=MATERIAL_CHOICES)
    imagenes = models.ManyToManyField(ImagenesOferta, verbose_name='Imagenes de la Oferta', blank=True)
    usuario = models.ForeignKey(Usuario, verbose_name='Usuario', null=False, blank=False, on_delete=models.CASCADE)
    is_active = models.BooleanField(verbose_name='Activo/Inactivo', default=True)
    vendido = models.BooleanField(verbose_name='Vendido', default=False)
    fecha_creacion = models.DateTimeField(verbose_name='Fecha de Creación', auto_now_add=True)

    def __str__(self):
        return self.titulo

    class Meta:
        verbose_name = 'Oferta'
        verbose_name_plural = 'Ofertas',
        ordering = ['-fecha_creacion']

这是我的观点:

login_required(login_url='login')
def publish_offer(request):

    if request.method == 'POST':
        titulo = request.POST['titulo']
        descripcion = request.POST['descripcion']
        cantidad = request.POST['cantKilos']
        valor = request.POST['valor']
        material = request.POST['material']
        imagenes = request.FILES['imagenes']
        usuario = request.user

        oferta = Oferta(titulo=titulo, descripcion=descripcion, cantidad=cantidad, valor=valor, material=material, usuario=usuario)
        oferta.save()

        for imagen in imagenes:
            
            img = ImagenesOferta.objects.create(imagen=imagen)
            oferta.imagenes.add(img)

这是我身体的一部分我认为这可能是个问题

<div class="col-xl-4">
                                        <div class="form-group">
                                            <label for="valor" class="form-label">Agregar valor</label>
                                            <input type="number" class="form-control form-control-user"
                                            id="valor" name="valor" placeholder="0.00$">
                                        </div>
                                    </div>

通过审美和造型问题,我决定使用一个正常的形式

nnvyjq4y

nnvyjq4y1#

我强烈建议使用ModelForm,因为这将执行必要的数据验证和清理。

from django import forms

class OfertaForm(forms.ModelForm):
    class Meta:
        model = Oferta
        fields = ('titulo', 'descripcion', 'cantidad', 'valor', 'material')

在HTML表单中,您只需要将name="cantKilos"重命名为name="cantidad",但无论如何没有太多理由使用不同的名称。
在视图中,我们可以简单地使用表单,如果你不想,你 * 不 * 必须使用模板中的表单:

@login_required(login_url='login')
def publish_offer(request):
    if request.method == 'POST':
        form = OfertaForm(request.POST, request.FILES)
        if form.is_valid():
            form.instance.usuario = request.user
            offerta = form.save()
            imgs = [
                ImagenesOferta(imagen=imagen)
                for image in request.FILES.getlist('imagenes')
            ]
            ImagenesOferta.objects.bulk_create(imgs)
            oferta.imagenes.add(*img)
            return redirect('name-of-some-view')
    # otherwise this is a GET request, or the form was invalid
    # …

相关问题