首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用ModelMultipleChoiceField、Django将request.user传入表单

使用ModelMultipleChoiceField、Django将request.user传入表单
EN

Stack Overflow用户
提问于 2019-05-12 21:26:10
回答 1查看 202关注 0票数 1

我希望将request.user或request.user.pk从基于类的视图传递到ModelForm,以便使用request.user.pk过滤查询集。我有以下的看法:

class ArticleResurrectionView(MessageLoginRequiredMixin, FormView):
    model = Article
    form_class = ArticleResurrectionForm
    template_name = "articles/resurrection.html"
    success_url = reverse_lazy("articles:articles_main")
    redirect_message = "You have to be logged in to recover articles "

    def get_form_kwargs(self):
        kwargs = FormView.get_form_kwargs(self)
        kwargs["author_id"] = self.request.user.pk
        return kwargs

def get_form_kwargs(self):应该将self.request.user.pk作为kwargs"author_id“传递给form的初始化

对于这个视图,我有以下形式:

class ArticleResurrectionForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.author_id = kwargs.pop("author_id", None)
        forms.ModelForm.__init__(self, *args, **kwargs)


    title = forms.ModelMultipleChoiceField(label="Deleted articles", 

help_text="Please select the    article to recover", 

queryset=Article.default.filter(show=False, author=???) )

# I can not use self.author_id  here

目标是在标题中使用来自init的self.author_id,以这种方式过滤查询集,以显示仅由当前用户创建的条目。换句话说,我需要在标题中的查询集中传递self.author_id。

也许可以这样做:

def __init__(self, *args, **kwargs):
        self.author_id = kwargs.pop("author_id", None)
        forms.ModelForm.__init__(self, *args, **kwargs)
        self.fields[“title"].queryset = ???

无论如何,如果你知道如何将request.user放入查询集中--我很乐意得到你的解决方案。谢谢!

关于相关的管理器:"default“而不是标准的"objects",我使用了2个管理器:

class ArticleManager(models.Manager):
    """Shows only non deleted articles"""
    def get_queryset(self):
        return models.Manager.get_queryset(self).exclude(show=False)


class Article(models.Model):
    # related managers
    default = models.Manager() # shows all articles
    objects = ArticleManager() # shows only non deleted articles
.....
.....
.....
EN

回答 1

Stack Overflow用户

发布于 2021-05-22 09:14:07

将request.user添加到表单实例

form = FormItemForm(request.POST or None, request.user)

然后在您的form.py中添加以下内容

field = forms.ModelMultipleChoiceField(
        widget=forms.CheckboxSelectMultiple,
        queryset=Field.objects.none(),
        label='Fields',
        help_text='Please select a field.'
    )

def __init__(self, *args, **kwargs):
        us = args[1] or None
        forms.ModelForm.__init__(self, *args, **kwargs)
        self.fields['field'].queryset = Field.objects.filter(user=us)

试一试,看看它是否有效。它对我来说效果很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56099703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档