[Gfoss] Form di immissione dati per GeoDjango restituisce un errore di integrità

pierluigi de rosa pierluigi.derosa a gmail.com
Ven 26 Lug 2019 10:45:44 CEST


Il form dovrebbe bastare che tu lo faccia del tipo
class AddPointForm(forms.ModelForm):
class Meta:
model = AddPoint
fields = ('name', 'geom')
widgets = {'geom': OSMWidget(
                attrs={
                    'map_width': 800,
                    'map_height': 250,
                    'default_lat': 0,
                    'default_lon': 0,
                    'default_zoom': 2,
                    }
                )} Pierluigi

Il giorno ven 26 lug 2019 alle ore 10:30 Massimiliano Moraca <
massimilianomoraca a gmail.com> ha scritto:

> Ciao Pierluigi, grazie per l'indicazione. Ho fatto le correzioni che mi
> hai indicato(non mi era chiaro che geodjango eredita comunque modelli e
> form da django) ma continuo ad avere lo stesso errore:
>
>> IntegrityError at /map/create/add-points/
>> null value in column "geom" violates not-null constraint
>> DETAIL: Failing row contains (4, Punto aggiunto dal form, null).
>
>
> Il giorno ven 26 lug 2019 alle ore 10:09 pierluigi de rosa <
> pierluigi.derosa a gmail.com> ha scritto:
>
>> Ho letto velocemente il tuo codice ma riscontro un errore,
>> Io uso poco django 2.2 e più spesso 1.11 per questioni personali però nei
>> modelli devi importare solo quello da django.contrib.gis e non anche
>> django.contrib ovvero il models dovrebbe essere:
>>
>>  from django.contrib.gis.db import models
>>
>>
>>  class AddPoint(models.Model):
>>          name = models.CharField(max_length=100)
>>          geom = geomodels.PointField()
>>
>>          def __str__(self):
>>              return self.name
>>
>> stessa cosa per i form ovvero devi importare:
>> from django.contrib.gis import forms
>> e poi devi usare solo forms
>>
>> il resto del codice non l'ho visto ma questo errore penso sia rilevante
>>
>> Pierluigi De Rosa
>>
>> Il giorno ven 26 lug 2019 alle ore 08:32 Massimiliano Moraca <
>> massimilianomoraca a gmail.com> ha scritto:
>>
>>> Buongiorno a tutti,
>>> spero che tra voi ci sia chi può darmi una mano GeoDjango visto che sono
>>> oramai diversi giorni che sono arenato sul problema che descrivo qui[1].
>>>
>>> In pratica sto provando a sviluppare una piccola applicazione che
>>> consente
>>> di posizionare un punto su una mappa dandogli un nome. Da pannello di
>>> amministrazione di Django riesco a farlo senza problemi, visualizzando il
>>> punto sulla mappa. ma l'ostacolo ce l'ho con il form che ho sviluppato e
>>> che andrà a sostituire l'immissione da pannello di amministrazione di
>>> default.
>>>
>>> Ogni qualvolta uso il form infatti, una volta posizionato il punto sulla
>>> mappa, se do l'ok alla pubblicazione ho un errore di integrità. In
>>> pratica
>>> dei due dati che passo al form (nome del punto e coordinate) le
>>> coordinate
>>> sono NULL; questo dato non viene passato e quindi viene fuori l'errore
>>> perchè nella tabelle PostGIS associata non è previsto il valore NULL per
>>> le
>>> geometrie(giustamente).
>>>
>>> *models.py*
>>>
>>> >     from django.contrib.gis.db import models as geomodels
>>> >     from django.db import models
>>> >
>>> >     class AddPoint(models.Model):
>>> >         name = models.CharField(max_length=100)
>>> >         geom = geomodels.PointField()
>>> >
>>> >         def __str__(self):
>>> >             return self.name
>>>
>>>
>>> *forms.py*
>>>
>>> >     from django import forms
>>> >     from django.contrib.gis import forms
>>> >
>>> >     from .models import AddPoint
>>> >
>>> >     class AddPointForm(forms.ModelForm):
>>> >         name = forms.CharField(
>>> >             max_length=100,
>>> >             widget=forms.TextInput(
>>> >                 attrs={
>>> >                     "type": "text",
>>> >                     "class": "form-control form-control-lg",
>>> >                     }
>>> >                 ),
>>> >             )
>>> >         point = forms.PointField(
>>> >             widget=forms.OSMWidget(
>>> >                 attrs={
>>> >                     'map_width': 800,
>>> >                     'map_height': 250,
>>> >                     'default_lat': 0,
>>> >                     'default_lon': 0,
>>> >                     'default_zoom': 2,
>>> >                     }
>>> >                 ),
>>> >             )
>>> >
>>> >         class Meta:
>>> >             model = AddPoint
>>> >             fields = [
>>> >                 'name',
>>> >                 'point',
>>> >                 ]
>>>
>>>
>>> *views.py*
>>>
>>> >     def addPointOnMap(request):
>>> >         if request.method == "POST":
>>> >             geoform = AddPointForm(request.POST or None)
>>> >             if geoform.is_valid():
>>> >                 new_point = geoform.save()
>>> >                 return redirect('add_points_map')
>>> >         else:
>>> >             geoform = AddPointForm()
>>> >         context = {
>>> >             'geoform': geoform,
>>> >             }
>>> >         template = 'maps/editing/add_point.html'
>>> >         return render(request, template, context)
>>>
>>>
>>> Questo è il codice che ho prodotto. Come vedete è una banalissima
>>> applicazione ma a quanto pare non riesco a farla funzionare.
>>> Uso Django 2.2, il DB che uso è PostgreSQL 11 con PostGIS 2.5
>>>
>>> ----------
>>> [1]
>>>
>>> https://gis.stackexchange.com/questions/329992/form-returns-integrityerror
>>> _______________________________________________
>>> Gfoss a lists.gfoss.it
>>> http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
>>> Questa e' una lista di discussione pubblica aperta a tutti.
>>> I messaggi di questa lista non hanno relazione diretta con le posizioni
>>> dell'Associazione GFOSS.it.
>>> 796 iscritti al 28/12/2017
>>
>>
>>
>> --
>> Ing. Pierluigi De Rosa (PhD in Earth Science)
>> Contract Professor of Geographic Information System at University of
>> Perugia
>> cel: 3497558268 / fax: 075 7823038
>> skype: pierluigi.derosa
>>
>

-- 
Ing. Pierluigi De Rosa (PhD in Earth Science)
Contract Professor of Geographic Information System at University of Perugia
cel: 3497558268 / fax: 075 7823038
skype: pierluigi.derosa


Maggiori informazioni sulla lista Gfoss