【问题标题】:django - bootstrap datetimepicker is showing todays date in the text box alwaysdjango - 引导 datetimepicker 总是在文本框中显示今天的日期
【发布时间】:2019-03-01 08:24:09
【问题描述】:

问题是,即使我更改了值并保存了表单,当我必须重新加载表单或再次进入页面时,文本框不会显示我保存的值,而是今天的日期。

我发现这个question 的答案是将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.'
        ),
    )

【问题讨论】:

  • 您如何存储和检索保存的日期?
  • @AndroidNoobie 我用所有相关信息更新了问题。
  • @AndroidNoobie 很抱歉,但是 ping,但你知道吗?
  • 嗯,模型表单+更新视图默认应该这样做。实际上,如果我不使用 DateTimePicker (js),它会显示检索到的信息。而且,问题似乎在于这个 JS 更新了我的字段,删除了当前值,因为如果我更新页面,我可以立即看到当前日期。编辑:这是该字段的 gif,页面更新了几次:gyazo.com/175c1b4d9b81f6ffe6e95b97e32b23ef

标签: javascript datetimepicker bootstrap-datetimepicker eonasdan-datetimepicker


【解决方案1】:

我使用Bootstrap-DateTimePicker 创建了一个示例 Django 应用程序来尝试重现您的问题。

在我的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'})
        }

然后我读到 datetimepicker 使用 MomentJS,在 MomentJS 中,HH 对应于 24 小时时间,hh 对应于 12 小时时间。在您的 Python 时间字符串中,您使用的是 24 小时时间,因此您可能希望 datetimepicker 的 format 使用 HH 而不是 hh

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

我阅读了一些其他帖子,其中用户在日期/时间格式方面存在问题,因为他们在 JS 端使用的格式与他们在 Python 端使用的格式不同,所以一定要确保这些是相同的。使用这种格式,我能够让 datetimepicker 显示正确的日期和时间。

如果您进行了这些更改,您是否仍然遇到同样的问题?

【讨论】:

  • 看来我的项目正在使用 AM/PM,因为当我尝试这个时,它会抛出一个错误,说格式不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2018-03-20
  • 1970-01-01
相关资源
最近更新 更多