Я хочу установить минимальное значение для атрибута 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