Django - передача параметров во встроенную форму - PullRequest
5 голосов
/ 05 сентября 2011

Я использую inlineformset_factory для создания полей для связи между многими клиентами и сессиями с использованием промежуточной модели посещаемости.

В моем файле представлений есть следующее:

AttendanceFormset = inlineformset_factory(
    Session,
    Attendance,
    formset=BaseAttendanceFormSet,
    exclude=('user'),
    extra=1,
    max_num=10,
    )

session = Session(user=request.user)
formset = AttendanceFormset(request.POST, instance=session)

И, поскольку мне нужно было переопределить одно из полей формы, я добавил следующее к базовому классу набора форм:

class BaseAttendanceFormSet(BaseFormSet):

    def add_fields(self, form, index):
        super(BaseAttendanceFormSet, self).add_fields(form, index)
        form.fields['client'] = forms.ModelChoiceField(
                queryset=Client.objects.filter(user=2))

Теперь форма работает правильно, но мне нужно передать значение внабор форм, так что я могу фильтровать клиентов, отображаемых на основе текущего пользователя, а не просто с помощью идентификатора 2.

Может ли кто-нибудь помочь?

Любой совет приветствуется.

Спасибо.

РЕДАКТИРОВАТЬ

Для всех, кто читает, это то, что работает для меня:

def get_field_qs(field, **kwargs):
        if field.name == 'client':
            return forms.ModelChoiceField(queryset=Client.objects.filter(user=request.user))
        return field.formfield(**kwargs)

1 Ответ

8 голосов
/ 06 сентября 2011

Как насчет использования параметра formfield_callback inlineformset_factory вместо предоставления набора форм?Обеспечить возможность вызова, которая в свою очередь возвращает поле, которое должно использоваться в форме.

Обратный вызов полей формы получает в качестве 1-го параметра поле и ** kwargs для необязательных параметров (например, виджет).

Например (используя request.user для фильтра, при необходимости замените его на другое:

def my_view(request):
    #some setup code here

    def get_field_qs(field, **kwargs):
        formfield = field.formfield(**kwargs)
        if field.name == 'client':
            formfield.queryset = formfield.queryset.filter(user=request.user)
        return formfield

    AttendanceFormset = inlineformset_factory(
        ...
        formfield_callback=get_field_qs
        ...
    )

    formset = AttendanceFormset(request.POST, instance=session)

Чтобы лучше это понять, посмотрите использование formfield_callback в коде формы Джанго .

...