在基于类的模型的clean()方法中获取当前用户

问题描述 投票:0回答:1

我有产品添加/编辑表单。我有以下情况:

每个用户最多可以有2个帖子

现在,我要检查用户当前拥有多少产品。我在form_valid类的子类的CreateView中临时实现了这一点:

    def form_valid(self, form):
        max_prod = 2
        form.instance.author = self.request.user
        prod = len(User.objects.get(id=self.request.user.id).product_set.all())

        if prod > max_prod:
            form.add_error(error=f"You have reached product limit ({max_prod})", field="name")
            return super().form_invalid(form)
        else:
            return super().form_valid(form)

但是,我读到最好的方法是通过在clean()方法中为特定模型添加条件。但是,就我而言,我需要以某种方式获取当前用户。我该怎么办?

编辑:

我尝试添加以下内容:

prod = len(User.objects.get(id=self.author.id).product_set.all())

但是,执行此方法时似乎没有保存作者:

products.models.Product.author.RelatedObjectDoesNotExist:产品没有作者。

Edit2:产品型号:

class Product(models.Model):
    name = models.CharField(max_length=255)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

Edit3:如果可能的话,我想在模型级别创建它,因为我也有用于产品的REST api

python django python-3.x django-models python-requests
1个回答
0
投票

在models.py中,使您的用户类带有字段示例:

class User(models.Model):
    name = models.CharField(max_length=120)
    posts = models.IntegerField()

在views.py顶部:

from django.shortcuts import get_object_or_404
from .models import User

然后做:

prod = get_object_or_404(User, <id>)

显然是替换您可以通过以下方式访问帖子:

prod.posts
© www.soinside.com 2019 - 2024. All rights reserved.