CreateView 中的属性错误 - Django

AttributeError in CreateView - Django

我正在开发一个包含销售的程序。

我想在登记销售时,扣除已售产品库存的减少。这样做时,产品的数量会打折,但不会创建销售,我会收到此错误消息: 现在的错误是:AttributeError at /ventas/create/ 'NoneType' object has no attribute '__dict__'

并在控制台中: url = self.success_url.format(**self.object.__dict__) AttributeError: 'NoneType' object has no attribute '__dict__'

forms.py:

class VentasForm(forms.ModelForm):
    """Formulario modelo de ventas."""


    class Meta:
        """Meta class."""
        model = Venta
        fields = ('fecha', 'cliente', 'producto', 'cantidad', 'forma_pago')

    def clean(self):
        """Verificar si hay stock del producto."""
        data = super().clean()

        producto = Product.objects.get(id=data['producto'].pk)
        if producto.cantidad <= float(self.data['cantidad']):
            raise forms.ValidationError('No hay suficiente stock del producto.')
        return data

    def save(self):
        """Restar stock."""
        data = self.cleaned_data

        producto = Product.objects.get(id=data['producto'].pk)

        producto.cantidad -= float(data['cantidad'])
        producto.save()

views.py:

class CreateVentasView(CreateView):
    """Registrar venta."""

    template_name = 'ventas/create.html'
    form_class = VentasForm
    success_url = reverse_lazy('ventas:list')
    context_object_name = 'venta'

并在模板中:{{ form.as_p }}

您的 ModelForm save() 方法丢弃了超类保存的 return 值。你需要return它,例如

def save(self):
        """Restar stock."""
        data = self.cleaned_data

        producto = Product.objects.get(id=data['producto'].pk)
        producto.cantidad -= float(data['cantidad'])
        producto.save()

        return super().save()

作为一般规则:如果您确定要覆盖的方法永远不会 return 任何东西,那么您不必担心 return 任何东西。但是,如果您重写的方法有可能 return 有用的东西(现在或将来),那么请安全地使用它 return 无论如何 return。它会让你以后省去很多麻烦。

这里要考虑的一件事是,你有一个小的竞争条件,如果两个人在彼此的几毫秒内订购,你可能最终会认为你有足够的库存,因为客户#1 检查库存.. 没问题.. 然后客户 #2 检查库存,然后客户 #1 的订单被保存。当第一个订单可能只有足够的库存时,这将导致两个订单都被保存。