2

私の問題:

を受け入れるモデルがありますDateTimeField。ユーザーは からこれを入力しdjango-adminます。しかし、ユーザーのローカル タイムゾーンを取得する方法がわかりません。したがって、私の最善の方法は、ユーザーに日時を入力するように強制することUTCです。しかし、ユーザーの利便性のために、毎回オフセットを計算してから時間を計算する必要はありませんUTCDjangoこれを行う方法を提供していないようです。

私がやろうとしていること:

ユーザーがandを入力するとともに をcustom widget選択できるようにするを作成したいと思います。このために、私はフォームに私のこのウィジェットを使用させるつもりです。timezonedatetimejQuery datetime picker.overridedjango 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、ブラウザにナイスを表示し、ユーザーがdate-timeと を入力できるようにすることtimezoneです。Doneしたがって、ユーザーがこれをクリックするとjQuery UI、値textboxform.

ブロックにぶつかったようです。まったく考えられない:

とにかく、それが自分のファイル内またはファイル内でreferenceこれinputを可能にするのかわかりません。file はから拡張するつもりのファイルです。私はドキュメントを読み、クラスにはこの場合特に重要な 2 つのメソッドがあることを理解しました。メソッドとメソッド。前者は html テンプレートをレンダリングし、後者はデータ dict からその値を抽出します。(私は間違っているかもしれません。) しかし、コードのこれら 2 つの部分をリンクする方法がわかりません。私は助けが必要です。idnamewidgets.pywidgets.pydefinecustom widgetWidget*django.forms.widgets*Widgetrendervalue_from_data_dict

アップデート:

私はそれに取り組みましたが、うまくいきません。私が今までやってきたことは次のとおりです。

ui/admin.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()},
        }

widgets.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 admin には、ドロップダウンなどはありません。したがって、JavaScript関数が呼び出されていないと確信しています。どのように呼び出すことができますか?HTMLのユニコード文字列に沿ってレンダリングできるとは思いません。何か案は?私は一晩中これにいました。助けが必要です。

4

1 に答える 1

0

より一般的なウィジェットを作成できると思います。

まず、独自のウィジェットを作成するために、js、html、およびメディアを分離します。

widgets.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 に答える