自定义BootstrapDateTimePickerInput

2024-04-28 15:01:42 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的登记表。可笑的日期格式使我能够区分我的定制格式和更通用的格式

enter image description here

型号.py

 class User(AbstractBaseUser):
        d_o_b = models.DateField(default=timezone.now()-datetime.timedelta(days=6570))

6570是18*365

forms.py

 widgets = {'d_o_b': BootstrapDateTimePickerInput(format='%d/%d/%m/%m/%m/%m/%Y', attrs={'class':'datepicker-start'})}

当我更改日期时,日期格式将更改为美式格式

enter image description here

更改日期时,我希望保留自定义格式。我还想阻止用户选择2000年之前的日期

boostrap\u datetimepicker.html

这是默认代码(减去我修改的日期格式)。

  {% include "django/forms/widgets/input.html" %}

  <div class="input-group-append" data-target="#{{ widget.datetimepicker_id }}" data-toggle="datetimepicker">  

    <div style='background-color:blue' class="input-group-text"><i class="fa fa-calendar"></i></div>

  </div>

</div>


<script>
  $(function () {
    $("#{{ widget.datetimepicker_id }}").datetimepicker({
      format: 'DD/DD/MM/MMM/YYYY/',
      
    });
  });
</script>

我以为每次选择日期时widget.datetimepicker_id函数都会运行。我以为你用这个函数来确定你的日期在屏幕上的显示方式。但是这个函数似乎只有在您第一次加载页面时,并且只有当d_o_b有一个默认值时才有效

如果你有(a)

widgets = {'d_o_b': BootstrapDateTimePickerInput(format='%d/%d/%m/%m/%m/%m/%Y', attrs={'class':'datepicker-start'})}

反对(b)

widgets = {'d_o_b': BootstrapDateTimePickerInput()}

那么函数widget.datetimepicker_id似乎也没有效果

我把密码改成

<script>
  $(function () {
    $("#{{ widget.datetimepicker_id }}").datetimepicker({
      format: 'DD/DD/MM/MMM/YYYY/',
      changeMonth: false,
      changeYear: true,
      yearRange: "2005:2012"
    });
  });
</script>

不幸的是,我仍然能够选择2005年之前的日期,2012年之后的日期,并更改月份

在正常情况下,我希望用户能够更改月份,但我试图看看什么(如果有的话)代码对我的小部件有影响

在forms.py中,我有attrs={'class':'datepicker-start'})。我将下面的代码添加到boostrap_datetimepicker.html中,但它似乎对用户可以选择的日期没有影响

<script>
  $(function() {
    $(".datepicker-start" ).datepicker({
      changeMonth: false,
      changeYear: true,
      yearRange: "2005:2012",
      // more options can also be included

    });
$(".datepicker-end" ).datepicker({
      changeMonth: true,
      changeYear: true,
      yearRange: "1900:2012",

    });
  });
</script>

我把datepicker改为datetimepicker,这似乎也没有什么影响

我还尝试将data-target="#{{ widget.datetimepicker_id }}"更改为data-target="datepicker-start"。这似乎也没有任何影响

widgets.py

from django.forms import DateTimeInput

class BootstrapDateTimePickerInput(DateTimeInput):
    template_name = 'widgets/bootstrap_datetimepicker.html'

def get_context(self, name, value, attrs):
    datetimepicker_id = 'datetimepicker_{name}'.format(name=name)
    if attrs is None:
        attrs = dict()
    attrs['data-target'] = '#{id}'.format(id=datetimepicker_id)
    # attrs['data-target'] = '#{id}'.format(id=datetimepicker_id)

    attrs['class'] = 'form-control datetimepicker-input'
    context = super().get_context(name, value, attrs)
    context['widget']['datetimepicker_id'] = datetimepicker_id
    return context

我不知道我是否离实现我的目标还有一段距离。我现在很困惑。如果有人能给我一些指导,我将不胜感激

我看了一下开发工具。我感兴趣的元素具有id。因此,我将jQuery更改为以下内容,但没有任何效果

<script>
  $(function () {
    $("#id_d_o_b").datetimepicker({
      format: 'DD/DD/MM/MMM/YYYY/',
      changeYear: true,
      yearRange: "2005:2012"
      
    });
  });
</script>

enter image description here


Tags: namedividformatdata格式scriptdatepicker