2009-09-20 75 views
11

django新手在这里。我有一个注册页面的尝试。django dateTimeWidget没有显示

它由文本字段(名称,用户名,密码等)和DateField(生日)组成。

我想为DateField使用forms.DateTimeInput小部件,但是当页面呈现时,没有任何反应。难道我做错了什么?这是否有我可以忽略的东西?这似乎很简单,但我无法得到它的工作。

这是我的形式

class RegisterForm(forms.Form): 
    username = forms.CharField(max_length= 50) 
    password = forms.CharField(label=u'Password',widget = forms.PasswordInput(render_value=False))#password 

    birthday = forms.DateField(required=False,initial=datetime.date.today,widget = forms.DateTimeInput())#25 Oct 2006 

而且我非常简单的HTML

<form action="" method = "POST"> 
{{ form.as_p}} 
<input type='Submit' value='Register'/> 
</form> 
+0

你能澄清一下吗?整个表单是不是呈现,还是仅仅是DateTime字段? – David 2009-09-20 07:29:30

+0

窗体和“输入”出现。它的日历小部件没有。 – Tom 2009-09-20 15:55:18

+0

当我读DateInput小部件时,我也期待图形日期选取器控件(就像在django admin中)。不过,我猜这只是一个纯文本框。不直观的IMO。 – User 2010-05-25 04:10:57

回答

4

你不应该使用DateTimeInput与DateField - 无论是使用DateInput,或DateTimeField

但是,我怀疑你什么意思是'没有任何反应'是日历日期选择器的链接不会出现。这些不是标准表单框架的一部分,并且文档不建议它们显示Date/DateTimeInput。它们是管理应用程序的一部分,所以如果您需要在自己的应用程序中使用它们,则需要明确包含JavaScript文件。

最简单的方法是从django.contrib.admin.widgets开始使用AdminDateWidget,而不是DateInput。您还需要在您的模板jsi18n脚本:

<script type="text/javascript" src="/admin/jsi18n/"></script> 
+0

我真的很困惑Django在哪里与日期时间小工具。 Docs意味着1.1中的更新,但我不清楚它是什么。如果我有这样的表格:

 class EventForm(forms.ModelForm): summary = forms.CharField(label="Event Name", widget=forms.TextInput(attrs={'size':'40'})) dtstart = forms.DateTimeField(widget=AdminDateWidget()) dtend = forms.DateTimeField(widget=AdminDateWidget) 
JavaScript已加载,但未在窗体中显示日历图标。当我不断回头查看jQuery时,会对此有所清楚。 – PhoebeB 2009-09-29 12:15:26

+0

/admin/jsi18n需要isStaff – goh 2011-03-11 06:23:44

6

日历日期选择器是不是形成框架的一部分。
但是,您可以使用jQuery的日期选择控件

<script type="text/javascript" src="{{ MEDIA_URL }}js/jquery-min.js"></script> 
<!-- give correct location for jquery.js --> 
<script type="text/javascript" src="{{ MEDIA_URL }}js/jquery-ui-min.js"></script> 
<!-- give correct location for jquery-ui.js --> 
<script type="text/javascript"> 
    jQuery(function() { 
     jQuery("#id_birthday").datepicker({ dateFormat: 'yy-mm-dd' }); 
    }); 
</script> 
<form method="post"> 
    {{ form.as_p }} 
    <input type="submit" value="Create Phase" /> 
</form> 

在点击/选择生日的文本框,它会显示一个日历控件选择
请给你的jquery.js和jQuery-ui.js

的正确位置
10

Django DateInput小部件不会呈现任何东西,只是纯文本输入。不过,它确实会根据各种格式验证用户的输入,所以它不是无用的。

大多数人会认为它的行为与在Django Admin界面中找到的日期选择器的行为相同,所以它肯定有点令人困惑。

可以在您自己的应用程序中使用AdminDateWidget,但我会建议不要这样做。它需要a lot of fiddling around to make it work

最简单的解决方案是使用类似JQuery UI Datepicker的东西。只需在您的网页<head>如下:

<link type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/themes/redmond/jquery-ui.css" rel="Stylesheet" /> 
<script language="javascript" type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js"></script> 
底部

然后,把下面的行激活日期选择您的输入元素:

<script type="text/javascript"> 
    $(function(){ 
    $("#id_birthday").datepicker(); 
    }); 
</script> 

可以使这个多一点DRY如果你必须在创建自定义窗口小部件很多日期字段您forms.py

class JQueryUIDatepickerWidget(forms.DateInput): 
    def __init__(self, **kwargs): 
     super(forms.DateInput, self).__init__(attrs={"size":10, "class": "dateinput"}, **kwargs) 

    class Media: 
     css = {"all":("http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/themes/redmond/jquery-ui.css",)} 
     js = ("http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js", 
       "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js",) 

指定每个日期字段应该在你的f使用这个小工具奥姆斯:

birthday = forms.DateField(label="Birthday", widget=JQueryUIDatepickerWidget) 

且模板中,包括在<head>如下:

{{form.media}} 

而且通过将以下页面底部激活日期选择器的所有领域:

<script type="text/javascript"> 
    $(function(){ 
    $(".dateinput").datepicker(); 
    }); 
</script>