вторник, 19 августа 2014 г.

Django Passing Parameters (args or kwargs) to Form in Formset

Обнаружил что многие испытывают с проблемы с тем, чтобы передать какой нибудь параметр (чаще всего request или request.user) в форму, для динамического конструирования полей, например. Ведь при использовании formstet мы нигде в коде не создаем класс формы, как при рабоме с обычными формами:

form = MyForm(request=request)

На stackoverflow что только не советуют: переопределить приватный (?) метод _construct_form или использовать какую то уличную магию (которая у меня кстати никак не сработала).
А ведь все оказалось проще.

Found that many suffer from problems with pass parameter (request or request.user) into a form for constructing the dynamic fields, for example. After using formstet anywhere in the code, we do not create a class of the form, as in the slave with conventional forms:

 form = MyForm (request = request) 

On stackoverflow that just do not recommend: override private (?) method or use _construct_form what that street magic (which by the way I have not worked ). </ div>
But everything was easier.
Мы можем передать параметр при создании самого formset, аналогично форме:
myformset = SuperFormSet(request=request)
И обработать его известным образом:
class MyFormSet(BaseFormSet):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(MyFormSet, self).__init__(*args, **kwargs)
Так вот если параметр вам нужен именно для конструирования полей, то все можно сделать через метод add_fields, который казалось бы служит для добавления полей но самом деле с его помощью мы можем и переопределить уже существующие поля формы. Вот так можно использовать request для создания поля в форме в formset:
def add_fields(self, form, index):
        super(MyFormSet, self).add_fields(form, index)
        form.fields['section'].queryset = Section.objects.filter(store=self.request.user)

We can pass a parameter when creating formset inctance, similar to the form:
 myformset = SuperFormSet (request = request) 
And treat it in a known manner:
class MyFormSet (BaseFormSet):
    def _init__(self, * args, ** kwargs):
        self.request = kwargs.pop('request', None)
        super(MyFormSet, self).__init__(*args, **kwargs)
So if you want pass the parameter for the construction of fields, everything can be done through the method of   add_fields, which seemed to be used to add fields but actually using it, and we can redefine existing fields. That's how you can use the request to create a field in a form in formset:
def add_fields (self, form, index):
        super(MyFormSet, self).add_fields(form, index)
        form.fields['section'].queryset = Section.objects.filter(store = self.request.user)

Комментариев нет:

Отправить комментарий