在Django应用程序中集成日历小部件

5
如何在我的系统中集成日历小部件?我希望将日历小部件添加到已经使用Django设计的表单中。我附加了一个截图,显示我想要集成它的位置。而且,我希望日历小部件像这个http://www.dynarch.com/projects/calendar/这样。
需要修改哪个文件以及需要使用什么代码?

1
请检查此链接,它可能会解决您的问题:https://dev59.com/DHVD5IYBdhLWcg3wQJST - JInx 123
4个回答

13

forms.py

import datetime
from django.forms.extras.widgets import SelectDateWidget
from django.forms import ModelForm, Form

date_field = forms.DateField(widget=SelectDateWidget)

或者还有另一种方法,可以使用JavaScript 在自定义表单中使用Django时间/日期小部件,这可能会有所帮助


1
它总是说'DateField'对象没有属性'needs_multipart_form'..我该怎么做才能纠正它? - madeeha ameer
SelectDateWidget 是理想的选择。为什么其他无数关于同样问题的线程都没有提到它呢? - underscore_d

9

我已经想通了。你只需要在settings.py文件中激活管理员界面,并在forms.py文件中导入AdminDateWidget而不是SelectDateWidget即可。此外,将以下代码插入到表单的模板文件中。确保将其放在标签之间。这是代码:

<script type="text/javascript" src="/admin/jsi18n/"></script>
<script type="text/javascript" src="/static/admin/js/core.js"></script>
<script type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js">        </script>
<script type="text/javascript" src="/static/admin/js/jquery.min.js"></script>
<script type="text/javascript" src="/static/admin/js/jquery.init.js"></script>
<script type="text/javascript" src="/static/admin/js/actions.min.js"></script>
<script type="text/javascript" src="/static/admin/js/calendar.js"></script>
<script type="text/javascript" src="/static/admin/js/admin/DateTimeShortcuts.js"></script>

希望对某人有所帮助,谢谢!萨达特

5
在经历了一番努力后,我终于成功将其运用于Django 2.0.2中。你需要在模板的头部添加以下代码:

<script type="text/javascript" src="/jsi18n/"></script>
<script type="text/javascript" src="{% static 'admin/js/core.js' %}"></script>
<script type="text/javascript" src="{% static 'admin/js/admin/RelatedObjectLookups.js' %}"></script>

<link rel="stylesheet" type="text/css" href="{% static 'admin/css/forms.css' %}"/>
<link rel="stylesheet" type="text/css" href="{% static 'admin/css/base.css' %}"/>
<link rel="stylesheet" type="text/css" href="{% static 'admin/css/widgets.css' %}"/>

urls.py

from django.views.i18n import JavaScriptCatalog


urlpatterns = [
    ...
    path('jsi18n/', JavaScriptCatalog.as_view(), name='javascript-catalog'),

]

然后是forms.py

from django import forms
from .models import MyModel
from django.contrib.admin.widgets import AdminDateWidget


class TripDetailForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = '__all__'
        widgets = {
            'my_field': AdminDateWidget(),
}

使用这段代码,你就可以顺利进行。

这对我没有用,但是我没有收到任何错误信息。我的日期字段的小部件仍然是文本框。我使用 {{ form.as_p }} 渲染。 - Mark Chackerian
我通过添加两行代码<script type="text/javascript" src="{% static 'admin/js/calendar.js' %}"></script><script type="text/javascript" src="{% static 'admin/js/admin/DateTimeShortcuts.js' %}"></script>使其成功运行。 - Mark Chackerian
2
@MarkChackerian,这些行可以替换为{{form.media}}标记,这样更短。 - Dat TT
提醒一下,您不需要这些行。这只会搞乱您的表单。 `<link rel="stylesheet" type="text/css" href="{% static 'admin/css/forms.css' %}"/><link rel="stylesheet" type="text/css" href="{% static 'admin/css/base.css' %}"/>` - sage poudel

0
只是给那些正在使用 Django_filters 的人一个提示,如果他们想在日期字段上显示管理员日历(例如日期大于..),需要在创建的过滤器中声明小部件。就像这样:
class InterviewFilter(django_filters.FilterSet):

    start_date = django_filters.DateFilter(name='date',lookup_expr=('gt'), widget=AdminDateWidget())
    end_date = django_filters.DateFilter(name='date',lookup_expr=('lt'), widget=AdminDateWidget()) 
    registry_year = django_filters.DateRangeFilter(field_name='date', lookup_expr='year')

    class Meta:
        model = Interview
        fields = ['position', 'result', 'status']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接