栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

以自定义形式使用Django时间/日期小部件

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

以自定义形式使用Django时间/日期小部件

随着时间的流逝,此答案的复杂性不断提高,并且需要进行许多破解,可能应该警告你不要这样做。它依赖于管理员未记录的内部实现细节,可能会在将来的Django版本中再次中断,并且比找到另一个JS日历小部件并使用它更容易实现。

就是说,如果你决心进行这项工作,这是你必须做的:

  1. 为模型定义自己的ModelForm子类(最好将其放在应用程序的forms.py中),并告诉它使用AdminDateWidget / AdminTimeWidget / AdminSplitDateTime(用模型中的正确字段名称替换“ mydate”等):
from django import formsfrom my_app.models import Productfrom django.contrib.admin import widgets      class ProductForm(forms.ModelForm):    class meta:        model = Product    def __init__(self, *args, **kwargs):        super(ProductForm, self).__init__(*args, **kwargs)        self.fields['mydate'].widget = widgets.AdminDateWidget()        self.fields['mytime'].widget = widgets.AdminTimeWidget()        self.fields['mydatetime'].widget = widgets.AdminSplitDateTime()
  1. 更改你的URLconf,以将“ form_class”:ProductForm而不是“ model”:Product传递到通用的create_object视图(这当然意味着“从my_app.forms导入ProductForm”而不是“从my_app.models导入Product”)。

  2. 在模板的开头,包括{{form.media}},以输出指向Javascript文件的链接。

  3. hacky部分:admin日期/时间小部件假定i18n JS东西已加载,并且也需要core.js,但不会自动提供其中任何一个。因此,在{{form.media}}上方的模板中,你需要:

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

你可能还希望使用以下管理CSS(感谢Alex提到了这一点):

<link rel="stylesheet" type="text/css" href="/media/admin/css/forms.css"/><link rel="stylesheet" type="text/css" href="/media/admin/css/base.css"/><link rel="stylesheet" type="text/css" href="/media/admin/css/global.css"/><link rel="stylesheet" type="text/css" href="/media/admin/css/widgets.css"/>

这意味着Django的管理媒体(ADMIN_MEDIA_PREFIX)位于/ media / admin /-你可以更改其设置。理想情况下,你将使用上下文处理器将此值传递给模板,而不是对其进行硬编码,但这超出了此问题的范围。

这还要求将URL / my_admin / jsi18n /手动连接到django.views.i18n.javascript_catalog视图(如果未使用I18N,则为null_javascript_catalog)。你必须自己执行此操作,而不是通过管理应用程序,因此无论你是否登录到管理员都可以访问它(感谢Jeremy指出了这一点)。URLconf的示例代码:

(r'^my_admin/jsi18n', 'django.views.i18n.javascript_catalog'),

最后,如果你使用的是Django 1.2或更高版本,则需要在模板中添加一些其他代码来帮助小部件找到其媒体:

{% load adminmedia %} <script type="text/javascript">window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}";</script>


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/402425.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号