Передать имя пользователя в форму Django - PullRequest
0 голосов
/ 08 мая 2018

Итак, у меня есть пользовательская форма, где мне нужно передать request.user.username, чтобы я мог использовать ее для заполнения форм. ModelChoiceField в зависимости от того, какой пользователь обращается к ней. Вот что у меня есть

views.py

if request.method == 'POST':
    form = DepartmentForm(request.POST, username=request.user.username)
    # Do stuff
else:
     form = DepartmentForm(username=request.user.username)

forms.py

class DepartmentForm(forms.Form):
    def __init__(self, *args, **kwargs):
        self.username = kwargs.pop('username', None)
        super(DepartmentForm, self).__init__(*args, **kwargs)

    Company = forms.ModelChoiceField(queryset=Company.objects.raw('''
      SELECT DISTINCT c.id, c.name, c.createdBy, c.allowedTeam_ID FROM projects_company AS c
      LEFT JOIN auth_user_groups AS aug ON c.allowedTeam_id=aug.group_id
      LEFT JOIN auth_user AS au ON aug.user_id=au.id
      WHERE au.username = %s OR c.createdBy = %s''',
     [self.username, self.username]),
     empty_label='Select company', widget=forms.Select(attrs={'class': 'materialSelect', 'id': 'companyDropdown'}))

Но когда я пытаюсь выбрать заполнить self.username, я получаю NameError: имя 'self' не определено

Я пытался найти свое решение, но, похоже, ни одно из найденных мной не работает. Я был бы признателен за любую помощь, которую вы, ребята, можете оказать. Если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать, и я обновлю вопрос соответственно. Это ошибка, которую я получаю

строка 25, в DepartmentForm [self.username, self.username]), NameError: имя 'self' не определено Это конец запроса, в котором я выбираю на основе self.username

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Строка Company = forms.ModelChoiceField() оценивается при загрузке модуля. У вас нет доступа к self.username в этот момент.

Вместо этого вы должны установить queryset в методе __init__ формы:

class DepartmentForm(forms.Form):
    company = forms.ModelChoiceField(
        queryset=Company.objects.none(),  # use empty queryset now, we'll set the real queryset when the form is initialised
        widget=forms.Select(...),
    )

    def __init__(self, *args, **kwargs):
        self.username = kwargs.pop('username', None)
        super(DepartmentForm, self).__init__(*args, **kwargs)

        self.fields['company'].queryset = Company.objects.raw(...)
0 голосов
/ 08 мая 2018

Вы можете предварительно заполнить любое поле словарем:

if request.method == 'POST':
    # do stuff
else:
    form = DepartmentForm({"username":request.user.username})

или

if request.method == 'POST':
    # do stuff
else:
    form = DepartmentForm()
    form.initial = {"username":request.user.username}
...