【问题标题】:Using django form validation to check item inventory使用 django 表单验证检查项目库存
【发布时间】:2015-06-18 22:56:11
【问题描述】:

我正在为订购系统使用内联表单集。用户选择一个项目,然后输入他们想要的那个项目的数量。

表单集使用此模型表单。我正在尝试使用 clean 方法查看所选项目是否还有库存。我得到的错误是 'OrderedItemForm' 对象没有属性 'item'

class OrderedItemForm(forms.ModelForm):
item = forms.ModelChoiceField(queryset=Item.objects.all(), empty_label="(Nothing)")
quantity = forms.IntegerField(min_value=1)

def clean(self):
    count = Item.objects.get(pk=self.item.pk)
    if(self.quantity > count):
        raise ValidationError("Insufficient inventory")

class Meta:
    model = OrderedItem

这是我使用的模型:

class Item(models.Model):
    name = models.CharField(max_length=150)
    inventory = models.PositiveIntegerField(default=0)
    price = models.DecimalField(decimal_places=2, max_digits=5, default=0.0)

    class Meta:
        ordering = ('name',)

    def __unicode__(self):
        return self.name

class Order(models.Model):
    customer = models.CharField(max_length=150)
    setup = models.DateTimeField()
    takedown = models.DateTimeField()
    address = models.TextField()
    created = models.DateField(auto_now_add=True)

    def __unicode__(self):
        return u"%s's order" % self.customer

class OrderedItem(models.Model):
    order = models.ForeignKey(Order, related_name='ordered_items')
    item = models.ForeignKey(Item, related_name='orders')
    quantity = models.PositiveSmallIntegerField()

    def __unicode__(self):
        return u"%s (%d)" % (self.item, self.quantity)

还有观点:

def order_form(request):
    OrderedItemFormset = get_ordereditem_formset(OrderedItemForm, extra=1, can_delete=True)
    order = Order()

    if request.method == 'POST':
        form = OrderForm(request.POST, instance=order)
        formset = OrderedItemFormset(request.POST, instance=order)
        if form.is_valid() and formset.is_valid():
            order = form.save()
            formset.save()

            total = 0.0
            data = []
            for item in order.ordered_items.all():
                data.append({
                    'order': item.order.id,
                    'product': str(item.item.name),
                    'quantity': item.quantity,
                    'total': (item.item.price*item.quantity)
                })
                total += float((item.item.price*item.quantity))


            return render(request, "order_success.html", {
                'ordered_items': data,
                'grand_total': total,
                'order_num': order.pk,
                'order_name': order.customer,
            })
    else:
        form = OrderForm(instance=order)
        formset = OrderedItemFormset(instance=order)
    return render(request, "order_form.html", {'form': form, 'formset': formset})

【问题讨论】:

    标签: python django validation formset


    【解决方案1】:

    字段数据应从表单的cleaned_data字典中获取:

    def clean(self):
        item = self.cleaned_data['item']
        quantity = self.cleaned_data['quantity']
        if(quantity > item.inventory):
            raise ValidationError("Insufficient inventory")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多