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 позволяют отображать заполнитель, пока поле пустое и не в фокусе.

Вернуться на верх