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

umbertofilippo a tiscali.it umbertofilippo a tiscali.it
Ven 26 Lug 2019 11:10:12 CEST


Solo un consiglio:
nel sito gis.stackexchange solitamente è buona prassi non cancellare una domanda quando si è trovata la soluzione, ma lasciarla o eventualmente inserire la risposta a se stessi e accettarla.
In questo modo in futuro, tu o altri con lo stesso dubbio potranno avere chance di trovare la soluzione.

-----Messaggio originale-----
Da: Gfoss <gfoss-bounces a lists.gfoss.it> Per conto di Massimiliano Moraca
Inviato: venerdì 26 luglio 2019 10:56
A: pierluigi de rosa <pierluigi.derosa a gmail.com>
Cc: GFOSS.it <gfoss a lists.gfoss.it>
Oggetto: Re: [Gfoss] Form di immissione dati per GeoDjango restituisce un errore di integrità

Ho trovato l'errore!
Me lo hai fatto notare tu indirettamente.
Ho chiamanto point il field del form che nel modello ho chiamato geom. In realtà anche nel modello si chiamava point fino a qualche giorno fa ma per avere in PostGIS un nome di campo più familiare per me(geom) l'ho rinominato geom e nel frattempo ho fatto altre modifiche al codice.
Sistemato questo errore posso aggiungere i punti usando il form che ho sviluppato. Ho scritto un form così perchè piano piano voglio personalizzarlo ed anche perchè per me è più leggibile. Ho iniziato un anno fa a studiare Python e Django partendo da conoscenze quasi zero di programmazione e per questo alcune cose banali ancora mi sfuggono, come nel caso dell'errore nel form.

Grazie :)

Il giorno ven 26 lug 2019 alle ore 10:45 pierluigi de rosa < pierluigi.derosa a gmail.com> ha scritto:

> 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-integri
>>>> tyerror _______________________________________________
>>>> 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
>
_______________________________________________
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



Maggiori informazioni sulla lista Gfoss