Django DateTimeField输入表单

3
我在我的模型中有一个`DateTime`字段,我正在寻找一种简单的方法来使其在表单中看起来不错。类似于`SelectDateWidget`。
我一直在看很多类似的问题,似乎很难让像管理员日期选择器或jquery之类的东西工作。(这是我第一次使用Django,我以前从未使用过jquery)。
因此,我使用了来自这个示例的`ChoiceField`,但我也无法使其工作。我得到了“self未定义”的错误名称。我不能在这里使用`self`吗?还是有更好的、更简单的方法来做到这一点?我不需要花哨的日期选择器,只需要让用户输入变得容易即可。
class ProjectForm(ModelForm):
    startdate = forms.DateField()
    starthour = forms.ChoiceField(choices=((6,"6am"),(7,"7am"),(8,"8am"),(9,"9am"), ...))
    startminute = forms.ChoiceField(choices=((0,":00"),(15,":15"),(30,":30"),(45,":45")))

    class Meta:
        model = Project

    def clean(self):
        starttime = time(int(self.cleaned_data.get('starthour')), 
                         int(self.cleaned_data.get('startminute')))
        return self.cleaned_data

    try:
        self.instance.start_time = datetime.datetime.combine(
            self.cleaned_data.get("startdate"), starttime)
    except TypeError:
        raise forms.ValidationError("")

你的 try 块应该放在 'clean' 函数下面。 - Ahsan
2个回答

7

forms.py

from django import forms
from django.contrib.admin import widgets                                       

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['mydate'].widget = widgets.AdminDateWidget()
        self.fields['mytime'].widget = widgets.AdminTimeWidget()
        self.fields['mydatetime'].widget = widgets.AdminSplitDateTime()

在模板中:

<script type="text/javascript" src="/my_admin/jsi18n/"></script>
<script type="text/javascript" src="/media/admin/js/core.js"></script>

…或者,对于Django 1.4+版本:

{% load static %}

<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/global.css' %}"/>
<link rel="stylesheet" type="text/css" 
    href="{% static 'admin/css/widgets.css' %}"/>

<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.js' %}"></script>
<script type="text/javascript" 
    src="{% static 'admin/js/jquery.init.js' %}"></script>
<script type="text/javascript" 
    src="{% static 'admin/js/actions.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>

我需要同时拥有日期和时间的字段吗?还是可以只使用datetime字段? - ana
如果您只想使用datetime,那没问题,其他的只是示例。 - catherine
无论如何,它都能工作,但对于Django的最佳实践来说,这是一种不好的做法。 - catherine
好的,我已经创建了forms.py并且它可以工作,但是我不太确定模板中的表单应该是什么样子?现在我只有{{ form.as_p }}。 - ana
然后结果就是什么也没有,它只是将日期时间拆分为两个不同的输入。我一定漏掉了什么,但我不知道是什么。 - ana
显示剩余4条评论

2
如果你遇到了错误提示:
Could not parse the remainder: '/js/jquery.init.js'' from 'admin/js/jquery.init.js''". 

只需要在admin/js/jquery.init.js前面加上一个撇号即可。 如下所示:

'admin/js/jquery.init.js' 

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