2015-04-13 2 views
1

Im используя встроенный набор форм для системы заказа. Пользователь выбирает элемент, а затем вводит количество требуемого элемента.Использование проверки формы django для проверки товарной позиции

Формат использует эту модельную форму. Я пытаюсь использовать чистый метод, чтобы проверить, осталось ли инвентарь для выбранного элемента. Ошибка я получаю объект 'OrderedItemForm' не имеет атрибута 'элемент'

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}) 

ответ

1

поле данных должны быть получены из словаря cleaned_data формы:

def clean(self): 
    item = self.cleaned_data['item'] 
    quantity = self.cleaned_data['quantity'] 
    if(quantity > item.inventory): 
     raise ValidationError("Insufficient inventory") 
Смежные вопросы