如何在 Django 应用程序中使用 bootstrap-datepicker?
Posted
技术标签:
【中文标题】如何在 Django 应用程序中使用 bootstrap-datepicker?【英文标题】:How to use the bootstrap-datepicker in Django app? 【发布时间】:2015-03-24 17:57:25 【问题描述】:我想在我的 django 应用程序中使用 bootstrap-datepicker (https://bootstrap-datepicker.readthedocs.org)。我使用 Django 1.7。
在 index.html 文件中我有:
<link rel="stylesheet" href="% static 'my_app/css/bootstrap-theme.min.css' %">
<link rel="stylesheet" href="% static 'my_app/css/bootstrap.min.css' %">
<link rel="stylesheet" href="% static 'my_app/js/bootstrap-datepicker.js' %">
<link rel="stylesheet" href="% static 'my_app/css/datepicker.css' %">
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
<script>
$(document).ready(function()
$('.datepicker').datepicker();
);
</script>
在我的 forms.py 中有:
class Filter(django_filters.FilterSet):
class Meta:
model = MyModel
fields = ['user', 'date_from', 'date_to']
widgets = 'date': forms.DateInput(attrs='class':'datepicker')
我的 model.py 我用来设置日期:
date_from = models.DateField()
date_to = models.DateField()
当我浏览带有日期的页面时 - 在输入区域中不起作用。
【问题讨论】:
【参考方案1】:我遇到了类似的问题。您需要在任何自定义 jquery 文件之前调用 jquery min 文件。所以你的代码看起来像这样。
<link rel="stylesheet" href="% static 'my_app/css/bootstrap-theme.min.css' %">
<link rel="stylesheet" href="% static 'my_app/css/bootstrap.min.css' %">
<link rel="stylesheet" href="% static 'my_app/css/datepicker.css' %">
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
<link rel="stylesheet" href="% static 'my_app/js/bootstrap-datepicker.js' %">
<script>
$(document).ready(function()
$('.datepicker').datepicker();
);
</script>
我知道这几个月没有得到答复,但我想发布这个只是为了确保这可能对其他人有所帮助。
【讨论】:
【参考方案2】:虽然有一个 python 包似乎可以很好地解决这个问题,但我选择看看我是否可以使用 Django 的 widget 类来渲染 datepicker 属性,这在 docs 中提到过。
请注意,我只使用日期字段而不是日期时间字段,因为在这种情况下我不需要我的应用支持时间。
models.py
class MyModel(models.Model):
...
date = models.DateField()
...
forms.py
class MyForm(forms.Form):
...
'''
Here I create a dict of the HTML attributes
I want to pass to the template.
'''
DATEPICKER =
'type': 'text',
'class': 'form-control',
'id': 'datetimepicker4'
# Call attrs with form widget
date = forms.DateField(widget=forms.DateInput(attrs=DATEPICKER))
...
template.html
<div class="form-group">
<div class='input-group date' id='datetimepicker1'>
form.date
<span class="input-group-addon">
<span class="glyphicon glyphicon-calendar"></span>
</span>
</div>
</div>
JS
$(function ()
$('#datetimepicker1').datetimepicker(
format: 'YYYY-MM-DD' //This is the default date format Django will accept, it also disables the time in the datepicker.
)
);
【讨论】:
【参考方案3】:更新:警告,此建议使用 dateTIMEpicker 而不是 datepicker。我建议这样做是因为您不必使用 datetimepicker 的时间功能,所以在我的情况下它非常方便。
由于我一直试图让 datetimepicker 工作(结合模型表单)已经有一段时间了,我想我会发布解决方案,感觉就像是关于这个主题的所有 *** 帖子的积累;)
因此,首先,确保还包含 moment.js,因为它是 bootstrap-datetimepicker 所要求的(请参阅 this *** post)。顺序很重要,请参阅提到的帖子。
然后使用this site 获取您需要的日期时间选择器类型。如果您没有要嵌入 datetimepicker 的模型表单,则只需将其复制到 html 代码中即可。
如果您想像我一样将您的模型表单字段之一设为花哨的日期选择器(没有时间)字段,请执行以下操作:
base.html
<script type="text/javascript" src="scripts/bootstrap.min.js"></script>
<script type="text/javascript" src="scripts/moment-2.4.0.js"></script>
<script type="text/javascript" src="scripts/bootstrap-datetimepicker.js"></script>
forms.py
class MyForm(forms.ModelForm):
class Meta:
...
widgets = 'myDateField': forms.DateInput(attrs='id': 'datetimepicker12')
...
myForm.html:
<div class="row">
...
% bootstrap_form form %
...
</div>
<script type="text/javascript">
$(function ()
$('#datetimepicker12').datetimepicker(
inline: true,
sideBySide: true,
format: 'DD.MM.YYYY' /*remove this line if you want to use time as well */
);
);
</script>
希望我能为您节省一些时间:)
【讨论】:
抱歉,您正在使用另一个 javascript 库来回答,甚至没有说清楚。 这似乎没有回答这个问题。该问题询问的是 datepicker,而不是 datetimepicker,它们似乎是两个独立的(尽管可能相关)小部件。链接的文档没有提到需要时刻或日期时间选择器,那么是否有一些特定于日期选择器的文档表明这一点?【参考方案4】:适用于 DJango 版本 2.1、2.0、1.11、1.10 和 1.8
要在你的 Django 应用安装 django-bootstrap-datepicker-plus 中使用 Bootstrap 日期选择器,请按照 GitHub 页面上的 installation instructions 进行配置,然后您可以在自定义表单和模型表单中使用它,如下所示。
在自定义表单中的使用:
from bootstrap_datepicker_plus import DatePickerInput
class ToDoForm(forms.Form):
user = forms.CharField()
date_from = forms.DateField(widget = DatePickerInput())
在模型表单中的使用:
from bootstrap_datepicker_plus import DatePickerInput
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['user', 'date_from', 'date_to']
widgets =
'date_form': DatePickerInput(),
'date_to': DatePickerInput()
与 django-filters 一起使用:
from bootstrap_datepicker_plus import DatePickerInput
class Filter(django_filters.FilterSet):
class Meta:
model = MyModel
fields = ['user', 'date_from', 'date_to']
widgets = 'date': DatePickerInput()
免责声明: 这个 django 包由我维护。如有任何问题,请在 Github 页面上open issues,而不是将 cmets 放在这里。
【讨论】:
【参考方案5】:(Django 2.1, 1.11 和 python >2.7 和 > 3.4 兼容)工作和可重用解决方案,来自bootstrap-datepicker的自定义:
import re
from django.conf import settings
from django.utils.translation import get_language
from django import forms
from django.utils import formats, timezone
class BootstrapDatePicker(forms.DateInput):
format_re = re.compile(r'(?P<part>%[bBdDjmMnyY])')
def __init__(self, attrs=None, format=None):
'''
for a list of useful attributes see:
http://bootstrap-datepicker.readthedocs.io/en/latest/options.html
Most options can be provided via data-attributes. An option can be
converted to a data-attribute by taking its name, replacing each
uppercase letter with its lowercase equivalent preceded by a dash, and
prepending "data-date-" to the result. For example, startDate would be
data-date-start-date, format would be data-date-format, and
daysOfWeekDisabled would be data-date-days-of-week-disabled.
'''
# final_attrs provides:
# - data-provide: apply datepicker to inline created inputs
# - data-date-language: apply the current language
# - data-date-format: apply the current format for dates
final_attrs =
'data-provide': 'datepicker',
'data-date-language': get_language(),
'data-date-format': self.get_date_format(format=format),
'data-date-autoclose': 'true',
'data-date-clear-btn': 'true',
'data-date-today-btn': 'linked',
'data-date-today-highlight': 'true',
if attrs is not None:
classes = attrs.get('class', '').split(' ')
classes.append('datepicker')
attrs['class'] = ' '.join(classes)
final_attrs.update(attrs)
super(BootstrapDatePicker, self).__init__(attrs=final_attrs, format=format)
def get_date_format(self, format=None):
format_map =
'%d': 'dd',
'%j': 'd',
'%m': 'mm',
'%n': 'm',
'%y': 'yy',
'%Y': 'yyyy',
'%b': 'M',
'%B': 'MM',
if format is None:
format = formats.get_format(self.format_key)[0]
return re.sub(self.format_re, lambda x: format_map[x.group()], format)
@property
def media(self):
root = 'vendor/bootstrap-datepicker'
css = 'screen': ('vendor/bootstrap-datepicker/css/bootstrap-datepicker3.min.css',)
js = ['%s/js/bootstrap-datepicker.min.js' % root]
js += ['%s/locales/bootstrap-datepicker.%s.min.js' % (root, lang) for lang, _ in settings.LANGUAGES]
return forms.Media(js=js, css=css)
然后我使用 BootstrapDatePicker 自定义类实现了我的表单:
class MyModelForm(BootstrapForm, forms.ModelForm):
class Meta:
model = myModel
fields = ('field1', 'field2', 'date')
widgets =
'data': BootstrapDateTimePicker(attrs='class': 'form-control'),
最后我在模板中加入了 js/css。
【讨论】:
以上是关于如何在 Django 应用程序中使用 bootstrap-datepicker?的主要内容,如果未能解决你的问题,请参考以下文章
css 来自http://www.wearesicc.com/quick-tips-5-column-layout-with-twitter-bootstrap/
如何知道在 django 中使用了哪个版本的应用程序 [重复]