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 的订单被保存。当第一个订单可能只有足够的库存时,这将导致两个订单都被保存。
我正在开发一个包含销售的程序。
我想在登记销售时,扣除已售产品库存的减少。这样做时,产品的数量会打折,但不会创建销售,我会收到此错误消息:
现在的错误是: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 的订单被保存。当第一个订单可能只有足够的库存时,这将导致两个订单都被保存。