фильтровать модели объектов в зависимости от пользователя - PullRequest
0 голосов
/ 05 июня 2018

У меня есть форма, которая содержит несколько полей, среди этих полей project, который должен быть select виджетом, который содержит проекты, в которых зарегистрирован зарегистрированный пользователь. Это часть моего кода.

class PublicationForm(forms.ModelForm):
    def __init__(self, *args, user=None, **kwargs):
        super(PublicationForm, self).__init__(*args, **kwargs)
        self.user = user

    project = forms.ModelChoiceField(
        queryset=ProjectMembers.objects.filter(user__username=user),
        widget=forms.Select,
        required=False
    )

    class Meta:
        model = Publication
        fields = ['title', 'content', 'project', 'source']

Я передаю зарегистрированному пользователю форму в моем представлении следующим образом
PublicationForm(request.POST, user=request.user) Но я в классе формы не могу получить доступ к пользовательской переменной, я попытался
...queryset=ProjectMembers.objects.filter(user__username=self.user).. ...queryset=ProjectMembers.objects.filter(user__username=user).., ноЯ получил эти ошибки
NameError: name 'self' is not defined и NameError: name 'user' is not defined

Существует ли решение или другой метод для фильтрации проектов, членом которых является зарегистрированный пользователь.Заранее спасибо.

1 Ответ

0 голосов
/ 05 июня 2018

Ваше определение project выполняется только один раз при запуске сервера, поэтому оно не может зависеть от self или любых других вещей.Вы должны различать определение класса и создание экземпляра.Чтобы сделать его динамичным, вы должны удалить его из определения класса и установить его внутри __init__, чтобы вы могли получить к нему доступ self.

def __init__(self, *args, user=None, **kwargs):
    super(PublicationForm, self).__init__(*args, **kwargs)
    self.user = user
    self.fields['project'] = forms.ModelChoiceField(   
        queryset=ProjectMembers.objects.filter(                    
            user__username=self.user
        ),
        widget=forms.Select,
        required=False
    )

Таким образом, каждый экземпляр вашей формы получитдругое project поле.Кроме того, вам, возможно, придется удалить его из fields в Meta, если вы получите такие ошибки, как field is not defined или что-то подобное.

...