передать request.user в форму с помощью ModelMultipleChoiceField, Django - PullRequest
1 голос
/ 12 мая 2019

Я хочу передать 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"] в init

формы

Тогда у меня есть следующая форма для этого представления:

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

Цель - использовать self.author_id из init в заголовке для фильтрации набора запросов таким способом, чтобы показывать только записисделано текущим пользователем.Другими словами, мне нужно передать 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 в наборе запросов - я был бы рад получить ваше решение по этому вопросу.Спасибо!

ps относительно связанных менеджеров: «по умолчанию» вместо стандартных «объектов», я использую 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
.....
.....
.....

1 Ответ

1 голос
/ 12 мая 2019

Ваш второй подход действительно правильный, хотя вы, вероятно, хотите использовать ModelChoiceField [Django-doc] вместо ModelMultipleChoiceField [Django-doc] , так как последний позволяет вам выбрать множественные такие Article с, но логика вашей формы (title) намекает на то, что это единственное число.

class ArticleResurrectionForm(forms.ModelForm):

    title = forms.<b>ModelChoiceField</b>(
        <b>queryset=Article.objects.none()</b>
        label='Deleted articles',
        help_text='Please select the article to recover'
    )

    def __init__(self, *args, **kwargs):
        author_id = kwargs.pop("author_id", None)
        forms.ModelForm.__init__(self, *args, **kwargs)
        self.fields['title']<b>.queryset</b> = Article.objects.filter(
            author_id=author_id,
            show=False
        )

Таким образом, первоначально мы определяем набор запросов как пустой, но позже исправляем это, указав другой набор запросов в конструкторе формы.

Что касается вашего представления, вы, вероятно, захотите сделать вызов super() вместо вызова метода определенного класса, например:

class ArticleResurrectionView(MessageLoginRequiredMixin, FormView):

    # ...

    def get_form_kwargs(self):
        kwargs = <b>super().get_form_kwargs()</b>
        kwargs['author_id'] = self.request.user.pk
        return kwargs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...