2017-07-12 3 views
0

このサイトで多くの検索を行い、私の質問の一部を見つけましたが、私は見つけられません。たぶん、私は適切なキーワードを使用していないとこれはよくある質問ですか?もしそうなら、謝罪してください。入力がDjangoの行と一致するときに既存のデータベースの値を変更するには

私は、barcode_inputという名前の入力値とフォームのbarcodeというモデルフィールドを一致させようとしています。 一致するものがあれば、ターミナルにprint( "There is a match!")と表示されます。

次のステップは、一致がある場合、特定のモデルamount_soldフィールドから減算された特定のモデル売却フィールド(一致するもの)にamount_input値を追加する必要がありますマッチです)。

これは、これまでの私のコードです。

models.py

from django.db import models 

class AddProduct(models.Model): 
    title = models.CharField(max_length=255) 
    barcode = models.IntegerField(default=0, primary_key=True) 
    stock_amount = models.IntegerField(default=0) 
    sold = models.IntegerField(default=0) 

    def __str__(self): 
     return self.title 

    class Meta: 
     verbose_name_plural = "Products" 

forms.py

from django import forms 
from .models import AddProduct 

class ScanProductForm(forms.Form): 
    barcode_input = forms.IntegerField(label='scan barcode') 
    amount_input = forms.IntegerField(label='amount') 
    def clean(self): 
     cleaned_data = super(ScanProductForm, self).clean() 
     barcode_input = cleaned_data.get("barcode_input") 
     amount_input = cleaned_data.get("amount_input") 

     try: 
      p = AddProduct.objects.get(pk=barcode_input) 
      p.sold += amount_input 
     except AddProduct.DoesNotExist: 
      raise forms.ValidationError("Does not exist") 

views.py

from django.shortcuts import render 
from .forms import ScanProductForm 

from .models import AddProduct 

def scan_product_view(request): 
    if request.method == 'POST': 

     form = ScanProductForm(request.POST or None) 

     if form.is_valid(): 
       print("There is a match!") 
     else: 
      form = ScanProductForm() 

     return render(request, 'scanapp/barscan.html', {'form': form}) 

答えて

0

あなたはこの種の仕事のために、DjangoのF式を使用する必要があります。
forms.py

from django.db.models import F 
from django import forms 
from .models import AddProduct 

class ScanProductForm(forms.Form): 
    barcode_input = forms.IntegerField(label='scan barcode') 
    amount_input = forms.IntegerField(label='amount') 
    def clean(self): 
     cleaned_data = super(ScanProductForm, self).clean() 
     barcode_input = cleaned_data.get("barcode_input") 
     amount_input = cleaned_data.get("amount_input") 

     try: 
      p = AddProduct.objects.get(pk=barcode_input) 

      p.sold = F('sold') + amount_input 
      p.save() 
     except AddProduct.DoesNotExist: 
      raise forms.ValidationError("Does not exist") 

より良いアプローチはforms.py にのみバーコード入力フィールドを検証し、views.pyにオブジェクトを更新するロジックを移動させることです。


forms.py

class ScanProductForm(forms.Form): 
    barcode_input = forms.IntegerField(label='scan barcode') 
    amount_input = forms.IntegerField(label='amount') 
    def clean_barcode_input(self): 
     barcode_input = self.cleaned_data['barcode_input'] 
     qs = AddProduct.objects.filter(pk=barcode_input) 
     if qs.exists(): 
      return barcode_input 
     raise forms.ValidationError("Barcode does not exist") 

views.py

from django.shortcuts import render 
from django.db.models import F 
from .forms import ScanProductForm 
from .models import AddProduct 

def scan_product_view(request): 
    if request.method == 'POST': 
     form = ScanProductForm(request.POST or None) 
     if form.is_valid(): 
      print("There is a match!") 
      barcode_input = form.cleaned_data.get("barcode_input") 
      amount_input = form.cleaned_data.get("amount_input") 
      p = AddProduct.objects.get(pk=barcode_input) 
      p.sold = F("sold") + amount_input 
      p.save() 
     else: 
      form = ScanProductForm() 
     return render(request, 'scanapp/barscan.html', {'form': form}) 
+1

おかげでたくさんの、魅力のように働きました。これは私のdjango/pythonの語彙を広げます:-)また、views.pyのロジックを行うための提案に感謝します! – sandermander

+0

お手伝いをしてうれしいです。 –

関連する問題