Geodjango管理员,显示点域不作为地图

use*_*840 4 django admin point geodjango

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

如何更改Django Admin中的显示,以便Pointfield不会像OpenLayer Map那样显示,而是显示为常规输入字段.我需要查看long,lat进行调试..

我必须更改字段类型吗?小工具?

谢谢!

rar*_*iru 6

更新

这就是我管理-at last的方式 - 为了保持格子和经度的单独字段而不必将它们保存在数据库中,因为这些值已经保存在PointField中.

这个想法是:

  • 如果我们要插入新条目,则将使用纬度和经度字段来设置PointField
  • 如果我们打开现有的PointField条目,它将用于在相关的FormFields中提供纬度和经度值.

models.py

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


class Entry(geomodels.Model):
    point = geomodels.PointField(
        srid=4326,
        blank=True,
        )
Run Code Online (Sandbox Code Playgroud)

admin.py

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


class EntryAdmin(admin.ModelAdmin):
    form = EntryForm


admin.site.register(Entry, EntryAdmin)
Run Code Online (Sandbox Code Playgroud)

forms.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 __init__(self, *args, **kwargs):
        if args:    # If args exist
            data = args[0]
            if data['latitude'] and data['longitude']:    #If lat/lng exist
                latitude = float(data['latitude'])
                longitude = float(data['longitude'])
                data['point'] = Point(longitude, latitude)    # Set PointField
        try:    
            coordinates = kwargs['instance'].point.tuple    #If PointField exists 
            initial = kwargs.get('initial', {})    
            initial['latitude'] = coordinates[0]    #Set Latitude from coordinates
            initial['longitude'] = coordinates[1]    #Set Longitude from coordinates
            kwargs['initial'] = initial
        except (KeyError, AttributeError):
            pass
        super().__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

PointField的源代码,我们可以看到,它的窗体类使用OpenLayersWidget继承BaseGeometryWidget.

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

如果将其设置为Truein yourapp/admin.py,您将获得一个包含lat和long以及其他数据的文本框,这对于调试非常有用:

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)
Run Code Online (Sandbox Code Playgroud)

还有一种方法可以永久地使用地图和手动插入经度/纬度(不仅用于调试).

我们的想法是使用FloatFields插入经度/纬度并使用插入的数据更新PointField.