django - загрузчик datetimepicker показывает текущую дату в текстовом поле всегда - PullRequest
0 голосов
/ 01 марта 2019

Проблема в том, что даже если я изменю значение и сохраню форму, когда мне придется перезагрузить форму или зайти на страницу в другой раз, в текстовом поле отображается не сохраненное мной значение, а сегодняшняя дата.

Я нашел этот вопрос , что ответом должно быть изменение useCurrent на false, но это не решает мою проблему.

Я занимаюсь разработкой с Django 2.1 и postgreSQL, но я думаю, что в этом случае это не имеет никакого отношения к проблеме, потому что, если я удаляю класс datetimepicker из ввода, дата отображается правильно.

Мой фактический JS:

var endDateMin = new Date();

endDateMin.setDate(endDateMin.getDate() + 1);

$(function () {
    $('.datetimepicker').datetimepicker(
        {
            format: 'DD/MM/YYYY hh:mm',
            minDate: endDateMin,
            useCurrent: false,
            icons: {
                time: "fa fa-clock-o",
                date: "fa fa-calendar",
                up: "fa fa-arrow-up",
                down: "fa fa-arrow-down",
                previous: "fa fa-arrow-left",
                next: "fa fa-arrow-right",
            }
        }
    );
});

Моя форма: (поле end_date)

class UpdateProjectGeneralForm(forms.ModelForm):
    end_date = forms.DateTimeField(input_formats=['%d/%m/%Y %H:%M',])

    class Meta:
        model = Project
        fields = ('name', 'short_description', 'category', 'investment', 'description',
                  'end_date', 'image')
        widgets = {
            'description': SummernoteWidget(attrs={'summernote': {
                'placeholder': 'Describe your project here...'}}),
            'image': FileInput(),
        }

    def __init__(self, *args, **kwargs):
        # first call parent's constructor
        super(UpdateProjectGeneralForm, self).__init__(*args, **kwargs)
        # there's a `fields` property now
        self.fields['investment'].required = True
        self.fields['name'].widget = forms.TextInput(
            attrs={'placeholder': 'enter the project name here...'})
        self.fields['short_description'].widget = forms.Textarea(
            attrs={'rows': '2',
                   'maxlength': '135',
                   'class': 'textarea-limited',
                   'placeholder': 'enter a short description of your project limited to 135 characters'})
        self.fields['end_date'].widget.attrs['class'] = 'datetimepicker'
        #if self.fields['end_date']:
            # self.fields['end_date'].widget.attrs['placeholder'] = self.fields['end_date']
        #else:
        self.fields['end_date'].widget.attrs['placeholder'] = datetime.now().strftime('%d/%m/%Y %H:%M')
        self.fields['category'].widget.attrs['class'] = 'selectpicker'
        self.fields['category'].widget.attrs['data-live-search'] = 'true'
        self.fields['category'].widget.attrs['data-size'] = '5'
        self.fields['image'].widget.attrs['class'] = 'btn btn-outline-default btn-file btn-round'
        # evade all labels and help text to appear when using "as_crispy_tag"
        self.helper = FormHelper(self)
        self.helper.form_show_labels = False
        self.helper._help_text_inline = True

Вид:

class ProjectEditGeneralView(LoginRequiredMixin, SuccessMessageMixin, generic.UpdateView):
    template_name = 'webplatform/project_edit_general.html'
    model = Project
    form_class = UpdateProjectGeneralForm
    success_message = 'Project successfully updated!'

    def get_success_url(self):
        return reverse_lazy('project-edit-general', args=(self.object.id,))

    # Make the view only available for the users with current fields
    def dispatch(self, request, *args, **kwargs):
        project = self.get_object()
        # here you can make your custom validation for any particular user
        if request.user != project.user:
            raise PermissionDenied()
        return super().dispatch(request, *args, **kwargs)

    # Set field as current user
    def form_valid(self, form):
        form.instance.user = self.request.user
        form.instance.history_change_reason = 'Project Updated'
        return super(ProjectEditGeneralView, self).form_valid(form)

Поле в модели:

end_date = models.DateTimeField(
        null=True,
        blank=True,
        help_text=_(
            'Select the end date of your project.'
        ),
    )

1 Ответ

0 голосов
/ 06 марта 2019

Я создал образец приложения Django с Bootstrap-DateTimePicker , чтобы попытаться воспроизвести вашу проблему.

В моем forms.py я добавил end_date в словарь widgets.Итак, в вашем примере ваш словарь widgets может выглядеть примерно так:

widgets = {
            'description': SummernoteWidget(attrs={'summernote': {
                'placeholder': 'Describe your project here...'}}),
            'image': FileInput(),
            'end_date': forms.DateTimeInput(attrs={'class': 'datetimepicker'})
        }

Затем я прочитал, что средство выбора даты и времени использует MomentJS, а в MomentJS HH соответствует 24-часовому времени, а hhсоответствует 12 часовому времени.В вашей временной строке Python вы используете 24-часовое время, поэтому вы, вероятно, хотите, чтобы ваш datetimepicker format использовал HH вместо hh:

$('.datetimepicker').datetimepicker(
        {
            ...
            format: 'DD/MM/YYYY HH:mm',
            ...
        }
);

Я читал несколько других сообщений, гдеУ пользователей были проблемы с форматированием даты / времени, потому что формат, который они использовали на стороне JS, отличался от того, который они использовали на стороне Python, поэтому определенно убедитесь, что они одинаковы.Используя этот формат, я смог заставить указатель даты и времени показывать правильную дату и время.

Если вы сделаете эти изменения, у вас все еще будет та же проблема?

...