Предварительно заполните немодельный атрибут формы при создании экземпляра в Django - PullRequest
1 голос
/ 05 августа 2020

Я хочу установить минимальное значение для атрибута DecimalField в форме в то время, когда я создаю его в представлении. И я хочу получить это минимальное значение от объекта, который я собираю из базы данных. Я заставил это (вроде) работать, вручную поместив форму html в шаблон, но хочу реорганизовать ее, чтобы использовать класс формы, потому что я могу делать более полезные вещи с данными в представлении, чем в шаблоне.

Основываясь на чтении других вопросов и документов, я не могу устанавливать атрибуты с помощью аргумента .initial. Я думал, что, вероятно, мне нужно переопределить метод __init__ в форме, но я почти уверен, что делаю это неправильно и синтаксически это не имеет смысла. Вот что я пробовал:

class BidForm(forms.Form):
    bid = forms.DecimalField(decimal_places=2)
    listing_bid = forms.CharField(widget=forms.HiddenInput())

    def __init__(self, min_bid, listing_pk, *args, **kwargs):
        super(BidForm, self).__init__(*args, **kwargs)
        self.fields['bid'].min = min_bid
        self.fields['listing_bid'] = listing_pk

Моя идея состоит в том, чтобы эта форма принимала min_bid и listing_pk и заполняла атрибут «min» на входе html тем, что находится в переменная min_bid. Я хочу поместить переданный listing_pk в качестве значения в скрытое поле с именем «isting_bid ». Если это поможет прояснить, я пытаюсь сгенерировать html эквивалент:

<input type="number" name="bid" min="{{ listing.current_bid }}">
<input type="hidden" name="listing_bid" value="{{ listing.pk }}">

В представлении я хотел бы сказать что-то вроде:

form = BidForm(min_bid=foo, listing_bid=bar)

Затем передайте это в контекст шаблона для рендеринга.

Есть ли в этом смысл? Я нашел некоторое обсуждение этого в контексте ModelForms, но не могу понять, как это сделать с помощью обычных форм.

Изменить: для справки в будущем, вот что сработало для меня. Я удалил атрибут ставки в форме, потому что я не хотел бы инициировать его без указания min_bid:

class BidForm(forms.Form):
    listing_bid = forms.CharField(widget=forms.HiddenInput())

    def __init__(self, min_bid, listing_pk, *args, **kwargs):
        super(BidForm, self).__init__(*args, **kwargs)
        self.fields['bid'] = forms.DecimalField(decimal_places=2, min_value=min_bid)
        self.fields['listing_bid'].initial = listing_pk

1 Ответ

1 голос
/ 05 августа 2020

Вы можете использовать атрибут .initial:

class BidForm(forms.Form):
    bid = forms.DecimalField(decimal_places=2)
    listing_bid = forms.CharField(widget=forms.HiddenInput())

    def __init__(self, min_bid, listing_pk, *args, **kwargs):
        super(BidForm, self).__init__(*args, **kwargs)
        self.fields['bid'].min_value = min_bid
        self.fields['listing_bid']<b>.intial</b> = listing_pk
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...