запрос не определен внутри класса forms.py (forms.Form) - PullRequest
0 голосов
/ 21 января 2019

Ошибка

NameError: name 'request' is not defined

Мои Forms.py

class PersonForm(forms.Form):
    name = forms.CharField(required=False)
    job_title = forms.CharField(required=False)
    status = forms.TypedChoiceField(choices=Person.STATUS_CHOICES)


    project = Project.objects.get(users=request.user, pk=self.kwargs.get('pk'))
    company = forms.ModelChoiceField(queryset=project.companies.all(),required=False)

    new_company = forms.CharField(required=False)
    note = forms.CharField(required=False)

    def __init__(self, *args, **kwargs):
        super(PersonForm, self).__init__(*args, **kwargs)
        for visible in self.visible_fields():
            visible.field.widget.attrs['class'] = 'form-control'


    def clean(self):
        return self.cleaned_data

views.py

class PersonCreate(LoginRequiredMixin, FormView):
    template_name = 'person/person_form.html'
    form_class = PersonForm
    success_url = '/project/'

    def form_valid(self, form):
        # This method is called when valid form data has been POSTed.
        # It should return an HttpResponse.
        cleaned_data = form.clean()

        active_project = self.request.session['active_project']

        project = Project.objects.get(users=self.request.user, pk=self.request.session['active_project'])

        if cleaned_data['name']:
            person, created = Person.objects.get_or_create(
                name=cleaned_data['name'], 
                job_title=cleaned_data['job_title'], 
                created_by=self.request.user,
                status=cleaned_data['status'], 
                project=project
            )

            if cleaned_data['new_company']:

                company, created = Company.objects.get_or_create(name=cleaned_data['new_company'], project=project, created_by=self.request.user)
                company.persons.add(person)
                company.save()

            if cleaned_data['note']:
                person.note_set.create(content=cleaned_data['note'], created_by=self.request.user)
                person.save()

            if cleaned_data['company']:

                company = project.companies.get(name=cleaned_data['company'])
                company.persons.add(person)
                company.save()

        return super().form_valid(form)

    def get_success_url(self):
        return self.request.POST.get('next', '/project/' + str(self.request.session['active_project']))

Я хочу отфильтровать queryset в поле forms.ModelChoiceField company. На основании компаний проекта пользователь имеет доступ к. Как бы я это сделал? Могу ли я получить доступ к данным request.session здесь?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

В представлениях на основе классов для обновления формы kwargs:

def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    kwargs.update({"request": self.request})
    return kwargs
0 голосов
/ 21 января 2019

Вы не можете так делать, потому что формы Django вообще не имеют доступа к запросу.

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

Сначала необходимо передать пользователя и pk в представлении.

views.py:

# ...
form = PersonForm(user=request.user, pk=kwargs.get('pk'))

Затем в вашей форме вы можете перехватить оба kwargs и обновить проект с правильным значением,

class PersonForm(forms.Form):
    # your form fields code ...

    def __init__(self, *args, **kwargs):
        # get the user and pk
        user = kwargs.pop('user', None)
        pk = kwargs.pop('pk', None)
        # update project field
        super(PersonForm, self).__init__(*args, **kwargs)
        self.fields['project'] = Project.objects.get(users=user, pk=pk)

        for visible in self.visible_fields():
            visible.field.widget.attrs['class'] = 'form-control'
...