Как передать начальный параметр в экземпляр ModelForm django?
Частный случай, который у меня есть, выглядит следующим образом:
У меня есть модель транзакции с полями: from
, to
(обе модели от ForeignKey
до auth.User
) и amount
. В моей форме я хотел бы представить поля пользователя 2 для заполнения: amount
и from
(to
будет автоматически настроен на текущий пользователь в функции просмотра).
Виджет по умолчанию для представления ForeignKey
- это поле выбора. Но то, что я хочу туда получить, ограничивает выбор только членами набора запросов user.peers
(так что люди могут регистрировать транзакции со своими сверстниками и не наводняться всеми пользователями системы).
Я попытался изменить ModelForm на что-то вроде этого:
class AddTransaction(forms.ModelForm):
from = ModelChoiceField(user.peers)
amount = forms.CharField(label = 'How much?')
class Meta:
model = models.Transaction
Но мне кажется, что я должен передать выборку выбора для ModelChoiceField
прямо здесь - где у меня нет доступа к веб-объекту request.user
.
Как я могу ограничить выбор в форме зависимыми от пользователя?
Ответы
Ответ 1
Используйте следующий метод (надеюсь, это достаточно ясно):
class BackupForm(ModelForm):
"""Form for adding and editing backups."""
def __init__(self, *args, **kwargs):
systemid = kwargs.pop('systemid')
super(BackupForm, self).__init__(*args, **kwargs)
self.fields['units'] = forms.ModelMultipleChoiceField(
required=False,
queryset=Unit.objects.filter(system__id=systemid),
widget=forms.SelectMultiple(attrs={'title': _("Add unit")}))
class Meta:
model = Backup
exclude = ('system',)
Создайте такие формы:
form_backup = BackupForm(request.POST,
instance=Backup,
systemid=system.id)
form_backup = BackupForm(initial=form_backup_defaults,
systemid=system.id)
Надеюсь, что это поможет! Дайте мне знать, если вам нужно, чтобы я объяснил более подробно.
Ответ 2
Я столкнулся с этой проблемой, и это было моим решением:
class ChangeEmailForm(forms.ModelForm):
def __init__(self, user, *args, **kwargs):
self.user = user
super(ChangeEmailForm, self).__init__(*args, **kwargs)
self.fields['email'].initial = user.email
class Meta:
model = User
fields = ('email',)
def save(self, commit=True):
self.user.email = self.cleaned_data['email']
if commit:
self.user.save()
return self.user
Ответ 3
В http://www.djangobook.com/en/2.0/chapter07/ раздел "Настройка начальных значений" описывает, как использовать параметр initial
для конструктора Form
. Вы также можете делать дополнительные вещи в методе __init__
вашего производного Form
.
Ответ 4
Передайте пользователя в форму __init__
формы, а затем вызовите super(…)
. Затем установите self.fields['from'].queryset
в user.peers