我有一个关于用表单处理每个用户的对象的问题。我只想与登录用户相关的对象进行交互。你知道吗
如果我提交一个表单,它会检查数据库中的每个对象,并返回2!有两个对象具有相同的product_id
时出错。
我对条形码使用product_id
字段,每个产品都是唯一的,有些用户使用相同的产品。你知道吗
我试图找到一种方法,先隔离用户对象,然后再处理数据库。还是有别的办法来处理这个问题?你知道吗
据我所知,objects.filter(user=request.user)
将不起作用,因为我需要objects.get
将表单字段的barcode_input
与某个数据库字段匹配,以减少数量。你知道吗
在问这个问题之前我搜索了很多,但是我已经没有技术关键词了。你知道吗
你知道吗型号.py你知道吗
class ProductModel(models.Model):
user = models.ForeignKey(User)
sku = models.CharField(max_length=100)
product_id = models.CharField(max_length=30, unique=False)
category = models.ForeignKey(ProductCategories, on_delete=models.CASCADE)
quantity = models.IntegerField(default=0)
amount_sold = models.IntegerField(default=0)
def __str__(self):
return self.product_line
你知道吗表单.py你知道吗
class ScanProductForm(forms.Form):
barcode_input = forms.CharField(widget=forms.TextInput(attrs={'autofocus': 'autofocus'}))
amount_input = forms.IntegerField(initial=1)
def clean_barcode_input(self):
barcode_input = self.cleaned_data['barcode_input']
qs = ProductModel.objects.filter(product_id=barcode_input)
if qs.exists():
return barcode_input
raise forms.ValidationError("Barcode does not exist")
你知道吗视图.py你知道吗
def barscan_view(request):
if request.method == 'POST':
form = forms.ScanProductForm(request.POST or None)
if form.is_valid():
barcode_input = form.cleaned_data.get("barcode_input")
amount_input = form.cleaned_data.get("amount_input")
p = ProductModel.objects.get(product_id=barcode_input)
if p.user.username == request.user.username:
if p.quantity >= 0 and amount_input <= p.quantity:
p.amount_sold = F("amount_sold") + amount_input
p.quantity = F("quantity") - amount_input
p.save()
messages.success(request, '%s - %s was successfully scanned' % (p.product_line, p.sku))
return HttpResponseRedirect('overview/scan/')
else:
if p.quantity > 0:
messages.error(request, 'Only %s in stock' %p.quantity)
elif p.quantity is 0:
messages.error(request, 'This product is out of stock')
else:
messages.error(request, 'ID does not match any of your stock')
else:
form = forms.ScanProductForm()
return render(request, 'maninv/scan_product.html', {'form': form})
谢谢,桑德
也许稍微重新设计一下视图逻辑可以帮助您达到预期的效果。您可以将
ScanProductForm
形式更改为ProductModel
的ModelForm
。然后,可以首先使用barcode_input
+request.user
检索ProductModel
实例。你知道吗表单.py
视图.py
但是在一些错误处理上有一个小的变化。通过
messages.error
与用户通信的某些内容现在是非字段错误。你知道吗相关问题 更多 >
编程相关推荐