在Django管理员中定制自定义小部件 [英] Custom widget with custom value in Django admin

查看:130
本文介绍了在Django管理员中定制自定义小部件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在模型中,我有整数字段。该字段的值的含义是自1.1.1970开始的天数,因此我希望使用 AdminDateWidget 在admin界面显示它,以便更容易地选择日期



我唯一的想法是创建新的小部件以将整数转换为日期:

  class ExpireWidget(AdminDateWidget):
def render(self,name,value,attrs = None):
如果isinstance(value,(int,long)):
value = datetime.date(1970,1,1)+ datetime.timedelta(value)
return super(ExpireWidget,self).render(name,value,attrs)
pre>

以下代码在 admin.py 中:

  class LdapUserAdminForm(forms.ModelForm):
class Meta:
widgets = {
'shadow_expire':ExpireWidget
}

当我在管理日期显示时,一切都可以,但在我保存之前,我应该将日期翻译成蒙古包。我以为我可以使用 clean_field_name 函数来实现它,但是在 clean_field_name 之前执行一些验证(是 clean()?),我得到错误,我应该键入整数值。



如何在验证之前将日期翻译成int?

解决方案

每个小部件都有从POST / GET获取数据的方法,并将该数据转换为Form验证。



它的方法 def value_from_datadict(self,data,files,name)



你可以看到它在这里使用:在Django管理员中的伪表单,在保存时生成一个json对象


In model I have integer field. Meaning of value of this field is "number of days since 1.1.1970", so I wanted to display it in admin interface as a date using AdminDateWidget to allow easier selection of date.

My only idea is to create new widget to translate integer to date:

class ExpireWidget(AdminDateWidget):
    def render(self, name, value, attrs=None):
        if isinstance(value, (int, long)):
            value = datetime.date(1970, 1, 1) + datetime.timedelta(value)
        return super(ExpireWidget, self).render(name, value, attrs)

And following code in admin.py:

class LdapUserAdminForm(forms.ModelForm):
    class Meta:
        widgets = {
            'shadow_expire': ExpireWidget
            }

When I'm displaying it in admin date everything is ok, but before I save it I should translate date to integer. I thought that I could achieve it using clean_field_name function, but some validation is executed before clean_field_name (is it clean()?) and I get error that I should type integer value.

How should I translate date to int before validation?

解决方案

Each widget has method for taking data back from POST/GET and translating that data for Form validation.

It's method def value_from_datadict(self, data, files, name)

You can see it used here: Pseudo-form in Django admin that generates a json object on save

这篇关于在Django管理员中定制自定义小部件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆