Django Форма DateInput с виджетом в обновлении: потеря начального значения - PullRequest
0 голосов
/ 07 апреля 2020

Мне нужно поле DateInput в ModelForm с датчиком по умолчанию HTML (я не использую сторонние библиотеки).

Так как DateInput по умолчанию отображается с <input type = "text">, DatePicker отсутствует (он поставляется бесплатно с <input type = "date">)

Я нашел несколько примеров, объясняющих, как изменить ввод введите, обработав widget параметры (ниже кода, который я сделал до сих пор)

Проблема

У меня работает корректно средство выбора даты, но в "режиме обновления" при передаче начального значения даты в форма (см. часть просмотра), дата остается пустой в HTML.

Я пытался найти причину, и кажется, что часть 'type': 'date' в настройке виджета очищает исходное значение некоторым образом; на самом деле, удаляя его, дата начального значения снова отображается, но я теряю указатель даты, конечно.

В представлении дата передается с допустимым значением

Я также нашел другое подобное без ответа вопрос , где поле было объявлено как

class DateInput(forms.DateInput):
    input_type = 'date'

date_effet = forms.DateField(widget=forms.DateInput(format='%d-%m-%Y'), label='Date effet')

проблема все еще остается

Мой код

model.py

class TimesheetItem(models.Model):

    date = models.DateField()
    description = models.CharField(max_length=100)
    # many other fields here

form.py

class TimesheetItemForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # init is used for other fields initialization and crispy forms


    class Meta:
        model = TimesheetItem
        fields = ['date', 'description']

        widgets = {
            'date': forms.DateInput(
                format=('%d/%m/%Y'),
                attrs={'class': 'form-control', 
                       'placeholder': 'Select a date',
                       'type': 'date'  # <--- IF I REMOVE THIS LINE, THE INITIAL VALUE IS DISPLAYED
                      }),
        }

view.py

def edit(request, uuid):
    try:
        timesheet_entry_item = TimesheetItem.objects.get(uuid=uuid)

        if request.method == 'POST':
            form = TimesheetItemForm(
                data=request.POST,
                instance=timesheet_entry_item
            )

            if form.is_valid():
                pass # save the form
        else:
            form = TimesheetItemForm(initial={
                'date': timesheet_entry_item.date,  # <--- the date here has a valid value
                'description': timesheet_entry_item.description
            })
        return render(request, 'template.html', {'form': form})
    except ObjectDoesNotExist:
        raise Http404("error")

Спасибо за любую помощь

M.

1 Ответ

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

Мне удалось заставить его работать. Следуя причине проблемы, я надеюсь, что она может быть полезна другим.

Элемент HTML <input type='date'> хочет получить дату в формате YYYY-mm-dd; на самом деле пример работы HTML должен выглядеть следующим образом:

<input type="date" name="date" value="2020-03-31" 
class="form-control dateinput form-control" 
placeholder="Select a date" required="" id="id_date">

Поскольку по умолчанию form.DateInput создает элемент <input type='text'>, он ожидает дату в локальном формате: скажем, '31 /03/2020'.

Принудительный 'type': 'date' и локальный формат format=('%d/%m/%Y') или отсутствие передачи формата вообще, он игнорирует переданное значение, так как <input type='date'> хочет format=('%Y-%m-%d')

Наконец правильная инструкция была:

widgets = {
    'date': forms.DateInput(
        format=('%Y-%m-%d'),
        attrs={'class': 'form-control', 
               'placeholder': 'Select a date',
               'type': 'date'
              }),
}
...