S
<У меня есть форма, которую я строю динамически на основе данных, предоставленных пользователем, используя crispy-forms. Для определенных типов данных я хочу предоставить пользователю поле SplitDateTimeField. Я хотел добавить атрибуты к этому полю, такие как placeholder, label или help_text, но не смог найти подсказки, как это сделать.
Я использовал виджет AdminSplitDateTime, чтобы хотя бы получить метки :
datetime = forms.SplitDateTimeField(widget=AdminSplitDateTime())
Хотя это приближает к тому, что я хочу, это не совсем то. Я искал в документации и пробовал с SplitDateTimeWidget, но не смог заставить работать ни один из его атрибутов.
Я сейчас в растерянности, что мне делать, поэтому спрашиваю здесь.
Моя форма, упрощенная (я сохранил в ней хрустящий FormHelper на случай, если он повлияет на поведение формы) :
from crispy_forms.helper import FormHelper
from django.urls import reverse_lazy
class ScriptInputForm2(forms.Form):
datetime = forms.SplitDateTimeField(widget=AdminSplitDateTime())
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.add_input(Submit('submit', 'Submit'))
self.helper.add_input(Submit('cancel', 'Back To Selection Page', css_class='ms-2 btn btn-danger'))
self.helper.attrs = {
'novalidate': ''
}
self.helper.form_class = 'form-horizontal'
self.helper.label_class = 'col-2'
self.helper.field_class = 'col-10'
self.helper.form_action = reverse_lazy('index')
В итоге я использовал DateTimeField с виджетом DateTimeInput типа datetime-local :
class ScriptInputForm2(forms.Form):
datetime = forms.DateTimeField(
widget=forms.DateTimeInput(
attrs={
'step': 1,
'placeholder': 'My datetime field',
'onfocus': "(this.type='datetime-local')",
'onblur': "(this.type='text')",
}
)
),
Атрибут step
полезен для того, чтобы получить секунды для отображения, в то время как onfocus
и onblur
позволяют отображать заполнитель, пока поле пустое и не в фокусе.