Form di immissione dati per GeoDjango restituisce un errore di integrità

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Form di immissione dati per GeoDjango restituisce un errore di integrità

Massimiliano Moraca
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
_______________________________________________
[hidden email]
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
Consulente GIS, Formatore, Blogger e Ciclista Urbano email: info@massimilianomoraca.it cell: 333 5949583 (lun-ven, 9.00-18.00) website: massimilianomoraca.it
Reply | Threaded
Open this post in threaded view
|

Re: Form di immissione dati per GeoDjango restituisce un errore di integrità

Massimiliano Moraca
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 <
[hidden email]> 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 <
> [hidden email]> 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
>> _______________________________________________
>> [hidden email]
>> 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
>
_______________________________________________
[hidden email]
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
Consulente GIS, Formatore, Blogger e Ciclista Urbano email: info@massimilianomoraca.it cell: 333 5949583 (lun-ven, 9.00-18.00) website: massimilianomoraca.it
Reply | Threaded
Open this post in threaded view
|

Re: Form di immissione dati per GeoDjango restituisce un errore di integrità

pierluigi de rosa-2
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 <
[hidden email]> 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 <
> [hidden email]> 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 <
>> [hidden email]> 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
>>> _______________________________________________
>>> [hidden email]
>>> 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
_______________________________________________
[hidden email]
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
Reply | Threaded
Open this post in threaded view
|

Re: Form di immissione dati per GeoDjango restituisce un errore di integrità

Massimiliano Moraca
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 <
[hidden email]> 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 <
> [hidden email]> 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 <
>> [hidden email]> 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 <
>>> [hidden email]> 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
>>>> _______________________________________________
>>>> [hidden email]
>>>> 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
>
_______________________________________________
[hidden email]
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
Consulente GIS, Formatore, Blogger e Ciclista Urbano email: info@massimilianomoraca.it cell: 333 5949583 (lun-ven, 9.00-18.00) website: massimilianomoraca.it
Reply | Threaded
Open this post in threaded view
|

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

umbertofilippo
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 <[hidden email]> Per conto di Massimiliano Moraca
Inviato: venerdì 26 luglio 2019 10:56
A: pierluigi de rosa <[hidden email]>
Cc: GFOSS.it <[hidden email]>
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 < [hidden email]> 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 <
> [hidden email]> 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 <
>> [hidden email]> 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 <
>>> [hidden email]> 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 _______________________________________________
>>>> [hidden email]
>>>> 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
>
_______________________________________________
[hidden email]
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

_______________________________________________
[hidden email]
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
Reply | Threaded
Open this post in threaded view
|

Re: Form di immissione dati per GeoDjango restituisce un errore di integrità

Massimiliano Moraca
Si, lo so, ma l'ho cancellato solo perchè il mio era un errore ridicolo.
Provvedo comunque a riattivare la domanda

Il giorno ven 26 lug 2019 alle ore 11:10 <[hidden email]> ha
scritto:

> 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 <[hidden email]> Per conto di Massimiliano Moraca
> Inviato: venerdì 26 luglio 2019 10:56
> A: pierluigi de rosa <[hidden email]>
> Cc: GFOSS.it <[hidden email]>
> 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 <
> [hidden email]> 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 <
> > [hidden email]> 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 <
> >> [hidden email]> 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 <
> >>> [hidden email]> 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 _______________________________________________
> >>>> [hidden email]
> >>>> 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
> >
> _______________________________________________
> [hidden email]
> 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
>
>
_______________________________________________
[hidden email]
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
Consulente GIS, Formatore, Blogger e Ciclista Urbano email: info@massimilianomoraca.it cell: 333 5949583 (lun-ven, 9.00-18.00) website: massimilianomoraca.it