Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Geodjango管理员,显示点域不是地图_Django_Admin_Point_Geodjango - Fatal编程技术网

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

Geodjango管理员,显示点域不是地图,django,admin,point,geodjango,Django,Admin,Point,Geodjango,这可能是个愚蠢的问题,但我找不到任何明确的答案 如何更改Django管理中的显示,使Pointfield不会显示为OpenLayer地图,而是显示为常规输入字段。我需要查看长的、用于调试的lat 我必须更改字段类型吗?小部件 谢谢 您可以在Django admin中用另一个小部件覆盖小部件。- 这将用RichTextEditorWidget覆盖TextField。只需找到点域的域类型,并用TextField覆盖它。更新 这就是我如何管理——最后——为latitude和longitude保留单独的

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

如何更改Django管理中的显示,使Pointfield不会显示为OpenLayer地图,而是显示为常规输入字段。我需要查看长的、用于调试的lat

我必须更改字段类型吗?小部件


谢谢

您可以在Django admin中用另一个小部件覆盖小部件。-


这将用
RichTextEditorWidget
覆盖
TextField
。只需找到点域的域类型,并用TextField覆盖它。

更新

这就是我如何管理——最后——为latitude和longitude保留单独的字段,而不必将它们保存在数据库中,因为值已经保存在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,
        )
管理员

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


class EntryAdmin(admin.ModelAdmin):
    form = EntryForm


admin.site.register(Entry, EntryAdmin)
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 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)

从中我们可以看出,它使用的是

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

如果在
yourapp/admin.py
中将其设置为
True
,您将得到一个文本框,其中包含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)

永久拥有地图和手动插入经度/纬度(不仅用于调试)

其思想是使用FloatFields插入经度/纬度,并使用插入的数据更新PointField

可能重复的
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)