Geodjango管理,显示点字段不作为地图。

问题描述 投票:7回答:2

这可能是一个愚蠢的问题,但我找不到任何明确的答案。

如何改变Django Admin中的显示方式,使Pointfield不像OpenLayer Map那样显示,而是作为一个普通的输入字段。我需要看到长、纬度,以便调试。

我需要改变字段类型吗?小工具?

谢谢!这可能是个很愚蠢的问题,但我需要看到的是一个普通的输入字段。

django admin point geodjango
2个回答
10
投票

更新

这就是我最后如何管理经纬度的单独字段,而不需要将它们保存在数据库中,因为这些值已经保存在PointField中。

我的想法是:

  • 如果我们插入一个新的条目,经纬度字段将被用来设置PointField。
  • 如果我们打开一个现有的PointField条目,它将被用来在相关的FormFields中提供经纬度值。

模型.py

from django.contrib.gis.db import models as geomodels


class Entry(geomodels.Model):
    point = geomodels.PointField(
        srid=4326,
        blank=True,
        )

admin.py

from myapp.forms import EntryForm
from django.contrib import admin


class EntryAdmin(admin.ModelAdmin):
    form = EntryForm


admin.site.register(Entry, EntryAdmin)

表单.py

from django import forms
from myapp.models import Entry
from django.contrib.gis.geos import Point


class MarketEntryForm(forms.ModelForm):

    latitude = forms.DecimalField(
        min_value=-90,
        max_value=90,
        required=True,
    )
    longitude = forms.DecimalField(
        min_value=-180,
        max_value=180,
        required=True,
    )

    class Meta(object):
        model = MarketEntry
        exclude = []
        widgets = {'point': forms.HiddenInput()}

    def clean(self):
        super().clean()
        if any(x for x in ['latitude', 'longitude'] if x in self.changed_data):
            latitude = float(self.cleaned_data['latitude'])
            longitude = float(self.cleaned_data['longitude'])
            self.cleaned_data['point'] = Point(longitude, latitude)

    def __init__(self, *args, **kwargs):
        try:    
            coordinates = kwargs['instance'].point.tuple    #If PointField exists 
            initial = kwargs.get('initial', {})    
            initial['longitude'] = coordinates[0]    #Set longitude from coordinates
            initial['latitude'] = coordinates[1]    #Set Latitude from coordinates
            kwargs['initial'] = initial
        except (KeyError, AttributeError):
            pass
        super().__init__(*args, **kwargs)

PointField的源码 我们看到,其 形体课 使用 OpenLayersWidget 其中 继承 来自 BaseGeometryWidget.

结论是,在这个类中,变量 显示_raw 默认设置为 False.

如果你把它设置为 Trueyourapp/admin.py你会得到一个文本框,里面有经纬度和其他数据,对调试很有用。

from django.contrib.gis import admin
from yourapp.models import YourClass
from django.contrib.gis import forms
from django.contrib.gis.db import models    


class YourClassAdminForm(forms.ModelForm):
    your_attribute = forms.PointField(widget=forms.OSMWidget(attrs={
            'display_raw': True}))

class YourClassAdmin(admin.GeoModelAdmin):
    form = YourClassAdminForm


admin.site.register(YourClass, YourClassAdmin)

还有一种方法 来永久地拥有地图和手动插入经纬度的功能(不仅仅是为了调试)。

我们的想法是使用FloatFields来插入经纬度,然后用插入的数据更新PointField。


2
投票

你可以在Django管理中用另一个部件覆盖一个部件。从文档中可以看到,在Django管理中,你可以用一个小部件覆盖另一个小部件。 -

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覆盖即可。

© www.soinside.com 2019 - 2024. All rights reserved.