2013-10-07 23 views

回答

1

您可以覆盖一个小部件与另一个在Django管理。 From the documentation -

from django.db import models 
from django.contrib import admin 

# Import our custom widget and our model from where they're defined 
from myapp.widgets import RichTextEditorWidget 
from myapp.models import MyModel 

class MyModelAdmin(admin.ModelAdmin): 
    formfield_overrides = { 
     models.TextField: {'widget': RichTextEditorWidget}, 
    } 

这将覆盖TextFieldRichTextEditorWidget。只需找到点字段的字段类型并使用TextField覆盖它即可。

0

In this post我通过在ModelForm中使用两个额外的“十进制字段”来解决此问题。这样,LatitudeLongitude字段出现在管理员用户的方便,而不会影响数据库,无论如何。

如果PointField存在,他们总是会反映相关的值,而他们可以更新它们或在PointField不存在的情况下创建它们。

4

由于Bibhas说你可以覆盖用于该字段的小部件,但简单的文本输入可能不是有用的。因此,这里是一个完整的小工具,可以用来GeoDjango内置的用于PointField一个例子:

class LatLongWidget(forms.MultiWidget): 
    """ 
    A Widget that splits Point input into latitude/longitude text inputs. 
    """ 

    def __init__(self, attrs=None, date_format=None, time_format=None): 
     widgets = (forms.TextInput(attrs=attrs), 
        forms.TextInput(attrs=attrs)) 
     super(LatLongWidget, self).__init__(widgets, attrs) 

    def decompress(self, value): 
     if value: 
      return tuple(value.coords) 
     return (None, None) 

    def value_from_datadict(self, data, files, name): 
     mylat = data[name + '_0'] 
     mylong = data[name + '_1'] 

     try: 
      point = Point(float(mylat), float(mylong)) 
     except ValueError: 
      return '' 

     return point 

现在你可以重写你的模型管理员:

from django.contrib.gis.db import models as geomodels 
class CompanyAdmin(admin.ModelAdmin): 
    list_display = ('name', 'approval', 'company_view',) 
    list_filter = ('approval',) 
    formfield_overrides = { 
     geomodels.PointField: {'widget': LatLongWidget}, 
    } 
+0

这将在每次保存时反转它们,我认为反转应该在解压缩中删除。 – Bufke

+0

你是对的@Bufke修复! –

1

如果你是新的GIS和你不知道在哪里定义点,上面的LatLongWidget需要知道Point是什么。你可以像这样导入它:

from django.contrib.gis.geos.point import Point