【问题标题】:GeoDjango PointField admin visualizationGeoDjango PointField 管理可视化
【发布时间】:2013-10-07 17:31:11
【问题描述】:

我想知道如何更改管理中的默认 PointField 可视化(Openstreetmap),以便我可以输入简单的纬度/经度,而不是在地图上选择一个点?

我查看了这个Latitude/longitude widget for pointfield?,但无法让它在 Django 1.6b4 中以任何方式工作

谢谢

【问题讨论】:

    标签: django-admin geodjango


    【解决方案1】:

    正如 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},
        }
    

    【讨论】:

    • 这会在每次保存时反转它们,我认为反转的应该在解压缩中删除。
    【解决方案2】:

    您可以在 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},
        }
    

    这会用RichTextEditorWidget 覆盖TextField。只需找到点字段的字段类型并用 TextField 覆盖它。

    【讨论】:

      【解决方案3】:

      如果您是 gis 新手,并且不知道 point 是在哪里定义的,那么上面的 LatLongWidget 需要知道 Point 是什么。你可以像这样导入它:

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

      【讨论】:

        【解决方案4】:

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

        如果PointField 存在,它们始终反映相关值,而如果PointField 不存在,它们可以更新或创建它们。

        【讨论】:

          猜你喜欢
          • 2012-10-01
          • 2011-11-13
          • 2011-12-01
          • 2016-04-29
          • 2017-01-07
          • 1970-01-01
          • 1970-01-01
          • 2014-08-16
          • 2018-01-27
          相关资源
          最近更新 更多