【发布时间】:2012-03-31 11:53:27
【问题描述】:
我正在尝试创建一个自定义模型字段和小部件,用于显示 google maps api v3 地图并单击选择一个点并将其存储。
数据库中的值应采用以下格式:LAT,LONG,FORMATTED_ADDRESS_BY_GOOGLE_REVERSE_GEOCODER
这是我的 fields.py:
from django.db import models
class LatLong(object):
def __init__(self, *args, **kwargs):
self.lat = kwargs.get('lat',0)
self.long = kwargs.get('long',0)
self.addr = kwargs.get('addr','')
class CoordField(models.Field):
description = 'Coordinates field'
__metaclass__ = models.SubfieldBase
def __unicode__(self):
return 'LatLong obj'
def __init__(self, *args, **kwargs):
kwargs['max_length'] = 255
super(CoordField, self).__init__(*args, **kwargs)
def db_type(self, connection):
return 'varchar(%s)' % self.max_length
def get_prep_value(self, value):
return '%s,%s,%s' % (value.lat, value.long, value.addr)
def to_python(self, value):
if isinstance(value, LatLong):
return value
try:
x = value.split(',')
except:
return LatLong(lat=0,long=0,addr='')
return LatLong(lat=x[0], long=x[1], addr=','.join(x[2:]))
还有我的 widgets.py:
from django.forms import Widget, TextInput
from django.template.loader import render_to_string
from django.utils.safestring import mark_safe
from settings import GMAPS_API_KEY
class LatLongWidget(TextInput):
class Media:
css = {
'all':('testing.css',)
}
js = (
'resource/js/coord.js',
)
def __init__(self, attrs=None):
default_attrs = {}
if attrs:
default_attrs.update(attrs)
super(LatLongWidget, self).__init__(default_attrs)
def render(self, *args, **kwargs):
output = super(LatLongWidget, self).render(*args, **kwargs)
output += render_to_string('maps/coord.html',
{'GMAPS_API_KEY':GMAPS_API_KEY,
'latlong': args[1]})
return mark_safe(output)
据我了解,该字段中的 to_python() 定义应该始终返回一个 python 对象,而 get_prep_value() 应该完全相反。
从下面的截图可以看出,表单上的字段输出不是逗号分隔的3个值,而是to_python()返回的LatLong对象的字符串repr。
当我调用 output = super(LatLongWidget, self).render(*args, **kwargs) 时,这会自动发生在我的小部件中
截图:
我在这里缺少什么?我应该实现更多功能吗?我做错了吗?
任何帮助将不胜感激。谢谢。
【问题讨论】:
-
表单上出现的字符串是 LatLong 对象的字符串表示形式,而不是 3 个逗号表示法。
-
问题对我来说似乎很简单。不知道你为什么被否决。
标签: django widget field render