Django: как установить начальные значения для поля в наборе форм встроенной модели?

У меня, как мне кажется, должна быть простая проблема. У меня есть встроенный набор форм модели, и я хотел бы, чтобы в поле выбора было выбрано значение по умолчанию для текущего пользователя, вошедшего в систему. В представлении я использую промежуточное ПО Django Authentication, поэтому получение пользователя - это простой вопрос доступа к request.user.

Однако я не смог понять, как установить этого пользователя в качестве выбранного значения по умолчанию в поле выбора (ModelChoiceField), содержащем список пользователей. Кто-нибудь может мне с этим помочь?


person Jeff    schedule 30.09.2009    source источник


Ответы (3)


Это помогает. Он работает, устанавливая начальные значения всех «лишних» форм.

formset = MyFormset(instance=myinstance)
user = request.user
for form in formset.forms:
    if 'user' not in form.initial:
        form.initial['user'] = user.pk
person Rune Kaagaard    schedule 22.11.2011

Я не уверен, как справиться с этим во встроенных наборах форм, но следующий подход будет работать для обычных форм и ModelForms:

Вы не можете установить это как часть определения модели, но вы можете установить его во время инициализации формы:

def __init__(self, logged_in_user, *args, **kwargs):
    super(self.__class__, self).__init__(*args, **kwargs)
    self.fields['my_user_field'].initial = logged_in_user

...

form = MyForm(request.user)
person mherren    schedule 30.09.2009
comment
Не уверен, как это будет работать со встроенным набором форм. Я использую inlineformset_factory для создания своего набора форм и передачи ему класса формы, а не экземпляра. Поэтому я не создаю экземпляр объекта формы напрямую в любом месте и не знаю, как передать ему этот параметр конструктора. - person Jeff; 01.10.2009
comment
Хммм ... Я считаю, что ModelForms примет значение "по умолчанию", не так ли? И стандартные поля формы используют начальные буквы, как вы показываете, но, насколько я знаю, нет причин использовать super () для этого. - person monkut; 01.10.2009
comment
Отлично! Я искал способ отправить данные из формы в представление, чтобы я мог отправлять статус, который будет отображаться с использованием инфраструктуры сообщений. В форме я использовал начальное ключевое слово, а затем в представлении, которое я сделал при проверке: cur_key_status = form.cleaned_data ['key_status'] messages.success (request, cur_key_status) - person radtek; 28.01.2014

Я использую идею Руне Каагаарда выше, за исключением того, что я заметил, что наборы форм предоставляют свойство extra_forms: код django.forms.formsets

@property
def extra_forms(self):
    """Return a list of all the extra forms in this formset."""
    return self.forms[self.initial_form_count():]

Итак, придерживаясь приведенного выше примера:

formset = MyFormset(instance=myinstance)
user = request.user
for form in formset.extra_forms:
    form.initial['user'] = user.pk

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

person Chris McGinlay    schedule 28.06.2015