Как передать запрос во встроенный набор форм с помощью django-extra-views

У меня есть форма с набором встроенных форм. Что я хотел бы сделать, так это когда пользователь попадает в форму, чтобы его информация о пользователе (например, имя) была предварительно заполнена в одной из встроенных строк формы. Чтобы иметь возможность передать запрос в строку.

Как это сделать?

Я использую django-extra-views 0.6 на Django 1.4.

В views.py я использую get_extra_form_kwargs def для настройки своих kwargs следующим образом:

class EventMemberInline(InlineFormSet):
    model = EventMember
    extra = 1
    form_class = EventMemberForm

    def get_formset_kwargs(self):
        formset_kwargs = super(EventMemberInline, self).get_formset_kwargs()
        formset_kwargs.update({'first_name':self.request.user.first_name, 'last_name':self.request.user.last_name})
        return formset_kwargs

Я делаю это, пытаясь связать поля моих встроенных строк (начальные значения) с тем, что я прохожу через kwargs (в данном случае только имя пользователя и фамилия)

In forms.py

class EventMemberForm(ModelForm):

    class Meta:
        model = EventMember

    def __init__(self, *args, **kwargs):
        self.fields['first_name'].initial = kwargs['first_name']
        self.fields['last_name'].initial = kwargs['last_name']
        super(EventMemberForm, self).__init__(*args, **kwargs)

Но я получаю эту ошибку:

Exception Value:    

__init__() got an unexpected keyword argument 'last_name'

Возможно ли то, что я пытаюсь сделать? Могу ли я установить начальное значение встроенного?


person darren    schedule 10.12.2012    source источник
comment
Я создал задачу для этого github.com/AndrewIngram/django-extra- просмотры/вопросы/35. Постараюсь быстро разобраться.   -  person Andrew Ingram    schedule 25.01.2013
comment
спасибо! это было бы здорово @AndrewIngram Я тем временем посмотрю на django-extra-views;)   -  person darren    schedule 25.01.2013
comment
Только что понял, что инлайнам уже задан запрос. Вы должны иметь возможность переопределить get_extra_form_kwargs в своей строке, чтобы передать пользовательский объект каждому экземпляру формы.   -  person Andrew Ingram    schedule 27.01.2013
comment
@AndrewIngram Я обновил вопрос. Если вы не против заглянуть украдкой. Очень ценится.   -  person darren    schedule 30.01.2013
comment
в 0.6.0 была ошибка, попробуйте 0.6.1. Также в вашем примере у вас есть get_formset_kwargs, а не get_extra_form_kwargs, это опечатка? Ваша форма тоже сломается, я поставлю «правильный» код в качестве ответа.   -  person Andrew Ingram    schedule 30.01.2013


Ответы (1)


Была проблема с django-extra-views==0.6.0, которая означала, что get_extra_form_kwargs не вызывался для встроенных строк, это должно быть исправлено в 0.6.1.

Это должно работать:

class EventMemberInline(InlineFormSet):
    model = EventMember
    extra = 1
    form_class = EventMemberForm

    def get_extra_form_kwargs(self):
        kwargs = super(EventMemberInline, self).get_extra_form_kwargs()
        kwargs.update({
            'first_name': self.request.user.first_name,
            'last_name': self.request.user.last_name
        })
        return kwargs

...

class EventMemberForm(ModelForm):

    class Meta:
        model = EventMember

    def __init__(self, *args, **kwargs):
        initial_first_name = kwargs.pop('first_name')
        initial_last_name = kwargs.pop('last_name')

        super(EventMemberForm, self).__init__(*args, **kwargs)

        self.fields['first_name'].initial = initial_first_name
        self.fields['last_name'].initial = initial_last_name
person Andrew Ingram    schedule 30.01.2013