Изменение содержимого ввода в форме django с данными запроса в __init __ () - PullRequest
1 голос
/ 13 января 2020

У меня есть форма django, которая содержит TypedMultipleChoiceField, содержащий группу пользователей. Я получил пользователей из пользовательской модели auth, но я хочу удалить текущего зарегистрированного пользователя из вариантов. Я пытался сделать это, вводя данные запроса в метод init формы, а затем удаляя вошедшего в систему пользователя из списка вариантов, но по какой-то причине форма по-прежнему отображает вошедшего в систему пользователя в списке вариантов. Код ниже:

Views.py

class IndexView(LoginRequiredMixin, generic.ListView, generic.edit.FormMixin):
    def get_form_kwargs(self):
        kwargs = super(IndexView, self).get_form_kwargs()
        kwargs.update({'user': self.request.user})
        return kwargs

    def get_queryset(self):
        return Project.objects.filter(owner=self.request.user.id).order_by('begin_date')

    form_class = CreateProject
    context_object_name = 'project_list'
    template_name = 'projects/project_index.html'

forms.py

class CreateProject(forms.Form):
    contributor_id = forms.TypedMultipleChoiceField(choices=list(User.objects.values_list('id','username')),
                                                    required=False, empty_value=[])
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop("user")
        super(CreateProject, self).__init__(*args, **kwargs)
        choices = self.fields['contributor_id'].choices
        del choices[choices.index((self.user.id, self.user.username))]

Когда я вставляю pdb.set_trace () в метод init и проверяю Состояние полей формы после выполнения удаления все выглядит корректно. Что я делаю не так?

Для справки я использовал this для get_form_kwargs в представлениях и init в формах.

1 Ответ

1 голос
/ 13 января 2020

Решением было изменить TypedMultipleChoiceField на ModelMultipleChoiceField, а затем установить набор запросов в качестве группы пользователей (исключить зарегистрированного пользователя) в методе init:

views.py

class IndexView(LoginRequiredMixin, generic.ListView, generic.edit.FormMixin):
    def get_form_kwargs(self):
        kwargs = super(IndexView, self).get_form_kwargs()
        kwargs.update({'user_id': self.request.user.id})
        return kwargs

    def get_queryset(self):
        return Project.objects.filter(owner=self.request.user.id).order_by('begin_date')

    template_name = 'projects/project_index.html'
    context_object_name = 'project_list'
    form_class = CreateProject

forms.py

class CreateProject(forms.Form):
    contributor_id = forms.ModelMultipleChoiceField(queryset=None, required=False)

    def __init__(self, *args, **kwargs):
        self.user_id = kwargs.pop("user_id")
        super(CreateProject, self).__init__(*args, **kwargs)
        self.fields['contributor_id'].queryset = User.objects.exclude(id=self.user_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...