Django Виджет формы DateInput не заполняется - PullRequest
2 голосов
/ 08 февраля 2020

У меня есть django форма редактирования, в которой много полей из модели, включая некоторые поля даты, для подходящего формата я использовал виджет DateInput. К сожалению, когда мы редактируем объект, все остальные поля уже заполнены существующими данными, кроме дат. Даты находятся в своем начальном состоянии (дд / мм / гггг), и, поскольку они обязательны, пользователь должен вводить даты заново каждый раз, когда он хочет отредактировать объект, даже если он не хочет изменять даты.

Кто-нибудь знает, как предварительно заполнить данные даты в этих полях даты?

forms.py:

 class DateInput(forms.DateInput):
        input_type = 'date'
        input_formats = ('%d-%m-%Y')
    [...]
 date_sinistre = forms.DateField(widget=DateInput, label='Date sinistre')
 date_effet = forms.DateField(widget=DateInput, label='Date effet')
 date_echeance = forms.DateField(widget=DateInput, label='Date échéance')

edit_object. html:

    <div class='row border border-primary rounded m-1 border-3'>
            <div class='col-md-4 p-0 pl-2 pr-2 justify-content-center align-self-center'>
                <strong>DATE DE SINISTRE:</strong>
            </div>
            <div class='col-md-8 p-0 pl-2 pr-0 justify-content-center align-self-center'>
                {{ dossierForm.date_sinistre|as_crispy_field }}
            </div>
        </div>

        <div class='row border border-primary rounded m-1 border-3'>
            <div class='col-md-4 p-0 pl-2 pr-2 justify-content-center align-self-center'>
                <strong>DATE EFFET:</strong>
            </div>
            <div class='col-md-8 p-0 pl-2 pr-0 justify-content-center align-self-center'>
                {{ dossierForm.date_effet|as_crispy_field }}
            </div>
        </div>

        <div class='row border border-primary rounded m-1 border-3'>
            <div class='col-md-4 p-0 pl-2 pr-2 justify-content-center align-self-center'>
                <strong>DATE ÉCHÉANCE:</strong>
            </div>
            <div class='col-md-8 p-0 pl-2 pr-0 justify-content-center align-self-center'>
                {{ dossierForm.date_echeance|as_crispy_field }}
            </div>
    </div>

PS: хотя я указал формат дд-мм-гг, виджет по-прежнему отображает дату в формате ММ-ДД-ГГГГ.

Снимок экрана: enter image description here

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Ваш DateInput производит элемент <input type = "date">, но этот тип элемента работает с форматом '%Y-%m-%d'.

Фактически, при проверке правильного элемента HTML, он должен выглядеть следующим образом:

<input type="date" name="date" value="2020-04-07" id="id_date">

Поскольку вы передаете дату в другом формате, начальное значение игнорируется.

Следующее должно работать

class DateInput(forms.DateInput):
        input_type = 'date'
        input_formats = ('%Y-%m-%d')
    [...]
 date_sinistre = forms.DateField(widget=DateInput, label='Date sinistre')
 date_effet = forms.DateField(widget=DateInput, label='Date effet')
 date_echeance = forms.DateField(widget=DateInput, label='Date échéance')
0 голосов
/ 08 февраля 2020

На основании исходного кода DateInput и DateTimeBaseInput [GitHub] необходимо указать format=&hellip; параметр [Django -doc] для конструктора:

class DateTimeBaseInput(TextInput):
    format_key = ''
    supports_microseconds = False

    def __init__(self, attrs=None, format=None):
        super().__init__(attrs)
        self.format = format or None

    def format_value(self, value):
        return formats.localize_input(value, self.format or formats.get_format(self.format_key)[0])


class DateInput(DateTimeBaseInput):
    format_key = 'DATE_INPUT_FORMATS'
    template_name = 'django/forms/widgets/date.html'

Таким образом, вы можете реализовать это с помощью:

    # &hellip;
    date_sinistre = forms.DateField(widget=forms.DateInput(<b>format='%d-%m-%Y'</b>), label='Date sinistre')
    date_effet = forms.DateField(widget=forms.DateInput(<b>format='%d-%m-%Y'</b>), label='Date effet')
    date_echeance = forms.DateField(widget=forms.DateInput(<b>format='%d-%m-%Y'</b>), label='Date échéance')

Кроме того, вам, вероятно, следует изменить настройку DATE_INPUT_FORMAT [Django -doc] и добавить формат '%d-%m-%Y' в качестве одного из допустимых форматов. .

...