2

我的问题:

我有一个接受的模型DateTimeField。用户从django-admin. 但是,我无法获取用户的本地时区。所以我最好的办法是强迫用户在UTC. 但为了用户方便,我不希望他/她每次计算偏移量,然后计算UTC. Django似乎没有提供这样做的方法。

我打算做什么:

我想创建一个custom widget也可以让用户在timezone输入dateand的同时选择time。为此,我正在使用jQuery datetime picker.我也打算让它使用我override的这个小部件。django admin

到目前为止我已经尝试过:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title> - jsFiddle demo by ioncache</title>
    <script type='text/javascript' src='http://code.jquery.com/jquery-1.7.1.js'></script>
    <link rel="stylesheet" type="text/css" href="/css/normalize.css">
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.js"></script>
    <link rel="stylesheet" type="text/css" href="/css/result-light.css">
    <script type='text/javascript' src="https://raw.github.com/trentrichardson/jQuery-Timepicker-Addon/master/jquery-ui-timepicker-addon.js"></script>
    <link rel="stylesheet" type="text/css" href="https://raw.github.com/trentrichardson/jQuery-Timepicker-Addon/master/jquery-ui-timepicker-addon.css">
    <link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/smoothness/jquery-ui.css">
    <style type='text/css'>
    </style>

    <script type='text/javascript'>//<![CDATA[
        $(window).load(function(){
        $(function() {
            $('#date-time-tz').datetimepicker({
            dateFormat: $.datepicker.RFC_2822,
            timeFormat: 'hh:mm:ss z',
            showTimezone: true,
            timezoneList: [
                {"value": "0", "label": "UTC"},
                {"value": "+60", "label": "FRANCE"},
                {"value": "+330", "label": "INDIA"},
                {"value": "-240", "label": "US EAST"},
                {"value": "-420", "label": "US SF"}
            ]
        });       
    });
    });//]]>  
    </script>

    </head>
        <body>
        <form name="time">
            <div style="margin: 15px;">
                <input id="date-time-tz" type="text" value="" name="date-time-tz">
                <input type="submit" value="Submit">
            </div>
        </form>
        </body>
</html>

没有任何东西action,或者method因为我不希望这个小部件出现在post任何地方。它所做的只是UI在浏览器中显示一个 nice 并让用户输入一个date-timeand timezone。因此,当用户单击Done此值时,该jQuery UI值将出现textboxform.

我似乎遇到了障碍。完全想不出来:

无论如何,我无法弄清楚这会让我reference通过inputid还是name在我的widgets.py文件中。widgets.pyfile 是我打算define通过custom widgetWidget. *django.forms.widgets*我通读了文档并发现Widget该类在这种情况下有两种特别重要的方法。和render方法value_from_data_dict。前者用于呈现 html 模板,后者用于从数据字典中提取该值。(我可能错了。)但我想不出任何方法来链接我的代码的这两个部分。我需要帮助。

更新:

我研究了它,但它不起作用。这是我到目前为止所做的:

用户界面/管理员.py

class MyModelAdmin(admin.ModelAdmin):
    class Media:
        css = {
                "all": ("style/jquery-ui.css",
                        "style/jquery-ui-timepicker-addon.css",)
            }
        js = ("js/jquery-ui.js",
              "js/jquery-ui-timepicker-addon.js",
              "js/tz_widget.js",)

    formfield_overrides = {
            models.DateTimeField : {'widget': TimezoneDate()},
        }

小部件.py

DATE_FORMAT = "%m-%d-%y"

class TimezoneDate(forms.widgets.Widget):

    def __init__(self, attrs=None):
        super(TimezoneDate, self).__init__(attrs)

    def render(self, name, value, attrs=None):

        if value is None:
            vstr = ''
        elif hasattr(value, 'strftime'):
            vstr = datetime_safe.new_datetime(value).stftime(DATE_FORMAT)
        else:
            vstr = value
        id = "%s" % name
        args = \
            "<input type=\"text\" value=\"%s\" name=\"%s\" id=\"date_time_tz\" />" % \
            (vstr, name)

        return mark_safe(u"\n".join(args))

这是tz_widget.js :

$(window).load(function(){
    $(function() {
        $('#date-time-tz').datetimepicker({
        dateFormat: $.datepicker.RFC_2822,
        timeFormat: 'hh:mm:ss z',
        showTimezone: true,
        timezoneList: [
            {"value": "0", "label": "UTC"},
            {"value": "+60", "label": "FRANCE"},
            {"value": "+330", "label": "INDIA"},
            {"value": "-240", "label": "US EAST"},
            {"value": "-420", "label": "US SF"}
        ]
    });       
});
});

我坚持的是如何从 tz_widget.js 调用 javascript?在 django 管理员中没有下拉菜单或任何东西。所以我确信javascript函数没有被调用。我怎么称呼它?我不认为我可以沿着 html unicode 字符串呈现它。有任何想法吗?我整晚都在这。需要一些帮助。

4

1 回答 1

0

我认为您可以创建一个更通用的小部件。

首先,将您的 js、html 和媒体分开,以创建一个独特的小部件。

小部件.py

 class DatTimeField(forms.Textarea):
     def render(self, name, attrs = None):
         final_attrs = self.build_attrs(attrs,name=name)
         return "Here you have to return the html of your widget, for example: mark_safe(u'<input type=text %s value=%s class='your_css_class'/>' % (flatatt(final_attrs), value))"

现在在您的管理课程中,试试这个:

class YourClassAdmin(admin.ModelAdmin): 
    class Media:
        css = {
            "all": ("my_styles.css",)
        }
        js = ("my_code.js",)

    formfield_overrides = {
        models.DateTimeField : {'widget': DatTimeField()},

    }

如果您想自定义您的小部件,我建议您查看 TinyMce 小部件代码。我知道这是一种不同的方式,但这段代码帮助我开发了自己的小部件(https://github.com/aljosa/django-tinymce/tree/master/tinymce

Django 文档也很有帮助:https ://docs.djangoproject.com/en/1.5/ref/forms/widgets/

于 2013-07-11T07:03:05.447 回答