Django表单:仅显示登录用户的多个对象

2024-05-14 13:58:23 发布

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

当前的问题是,我的表单向登录用户显示所有创建的公文包。表单应仅显示登录用户创建的公文包

大概是这样的:

associated_portfolios manytomany field = ...objects.filter(user=user_id)

我不确定这是否应该在forms.py或views.py中实现,如果是,如何实现。我查阅了django文档,找到了“formfield”for_manytomy,但不确定这是否只针对管理员

Models.py

class Portfolio(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=20)
    description = models.CharField(max_length=250, blank=True, null=True)

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=50)
    body = RichTextUploadingField(blank=True, null=True)
    associated_portfolios = models.ManyToManyField(Portfolio, blank=True)
    created_on = models.DateField(auto_now_add=True, editable=False)

Views.py

class PostCreate(CreateView):
    model = Post
    form_class = PostCreateForm

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        self.fields['associated_portfolios'] = Portfolio.objects.filter(user=self.request.user)
        return super().formfield_for_manytomany(db_field, request, using=self.using, **kwargs)

forms.py

class PortfolioCreateForm(ModelForm):
    class Meta:
        model = Portfolio
        fields = ['user', 'name', 'description']    

class PostCreateForm(ModelForm):
    class Meta:
        model = Post
        fields = ['user', 'title', 'body', 'category', 'associated_portfolios']

Tags: pyselftruefieldforonmodelsclass
2条回答

你试过这个吗

self.fields['associated_portfolios'] = Post.objects.filter(associated_portfolios__portfolio__user=request.user)

user_posts = Post.objects.filter(user=request.user)
self.fields['associated_portfolios'] = user_posts.associated_portfolios.all()

阅读更多关于M2M关系查询here的信息,因为我认为您的问题可能与此有关

另外,我不确定您的实际数据是否正确,它给出了一个正确的结果,即针对当前用户筛选Portfolio模型,以获得适合我的对象,但无论如何,再次仔细检查所有内容

最后,请注意,将related_name添加到模型字段中,这样您就可以轻松地将其用于反向关系,而不是使用Django的默认命名,这样会更清晰,更好地理解

由于您使用的是ModelForm,因此associated_protfolios字段将是ModelMultipleChoiceField[docs]。此字段具有queryset属性[docs]。我们想修改这个属性

Django的CreateView有一个方法get_form,在本例中,它将抓取您的PostCreateForm。这是筛选字段查询集的好地方,因为我们可以访问用户:

class PostCreate(CreateView):
    model = Post
    form_class = PostCreateForm

    def get_form(self, *args, **kwargs):
        form = super().get_form(*args, **kwargs)  # Get the form as usual
        user = self.request.user
        form.fileds['associated_portfolios'].queryset = Portfolio.objects.filter(user=user)
        return form

相关问题 更多 >

    热门问题