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

如何更改Django Admin中的显示,以便Pointfield不会像OpenLayer Map那样显示,而是作为常规输入字段显示。我需要查看冗长的调试时间。

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

谢谢!

最佳答案

更新

这就是我最后设法保留纬度和经度的单独字段而不必将其保存在数据库中的方式,因为值已经保存在PointField中。

这个想法是:

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

  • 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)
    

    表格
    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)
    

    source code of PointField中,我们看到其form class使用了OpenLayersWidget,而inherits来自BaseGeometryWidget

    结论是,在此类中,变量display_raw默认情况下设置为False

    如果将其设置为True中的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)
    

    There is also a way永久拥有 map 和经度/纬度的手动插入(不仅用于调试)。

    这个想法是使用FloatFields插入经度/纬度,并使用插入的数据更新PointField。

    关于django - Geodjango管理员,不以 map 显示点场,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21408638/

    10-09 13:05