2009-09-20 32 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>