Подтвердить что ты не робот

Как передать начальный параметр в экземпляр 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.

Как я могу ограничить выбор в форме зависимыми от пользователя?

4b9b3361

Ответ 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