Djang中每个FK/用户使用数据库对象

2024-04-25 23:43:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于用表单处理每个用户的对象的问题。我只想与登录用户相关的对象进行交互。你知道吗

如果我提交一个表单,它会检查数据库中的每个对象,并返回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})

谢谢,桑德


Tags: 对象用户formidinputifobjectsmodels
1条回答
网友
1楼 · 发布于 2024-04-25 23:43:50

也许稍微重新设计一下视图逻辑可以帮助您达到预期的效果。您可以将ScanProductForm形式更改为ProductModelModelForm。然后,可以首先使用barcode_input+request.user检索ProductModel实例。你知道吗

表单.py

class ScanProductForm(forms.ModelForm):
    barcode_input = forms.CharField(widget=forms.TextInput(attrs={'autofocus': 'autofocus'}))
    amount_input = forms.IntegerField(initial=1)

    class Meta:
        model = ProductModel
        fields = ('barcode_input', 'amount_input')

    def clean(self):
        cleaned_data = super().clean()
        amount_input = cleaned_data.get('amount_input')
        if self.instance.quantity == 0:
            self.add_error(None, 'This product is out of stock')
        elif amount_input > self.instance.quantity:
            self.add_error(None, 'Only %s in stock' % self.instance.quantity)
        return cleaned_data

    def save(self, commit=True):
        product = super().save(commit=False)
        amount_input = cleaned_data.get('amount_input')
        product.amount_sold = F('amount_sold') + amount_input
        product.quantity = F('quantity') - amount_input
        if commit:
            product.save()
        return product

视图.py

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

        product = None
        barcode = request.POST.get('barcode_input')
        queryset = ProductModel.objects.filter(product_id=barcode)
        if queryset.exists():
            try:
                # the queryset is already filtered by the barcode
                # now we apply an extra filter to check if this user has the product
                product = queryset.get(user=request.user)
            except ProductModel.DoesNotExist:
                # here we are sure this product exists, but this user doesnt have it in the stock.
                messages.error(request, 'ID does not match any of your stock.')
        else:
            # here we know this product doesnt exist
            messages.error(request, 'Barcode does not exist.')

        if product is not None:
            form = forms.ScanProductForm(request.POST, instance=product)
            if form.is_valid():
                form.save()
                messages.success(request, '%s - %s was successfully scanned' % (product.product_line, product.sku))
                return HttpResponseRedirect('overview/scan/')

    else:
        form = forms.ScanProductForm()
    return render(request, 'maninv/scan_product.html', {'form': form})

但是在一些错误处理上有一个小的变化。通过messages.error与用户通信的某些内容现在是非字段错误。你知道吗

相关问题 更多 >