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

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

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@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@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@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

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@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@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@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@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

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 :slight_smile:

Il giorno ven 26 lug 2019 alle ore 10:45 pierluigi de rosa <
pierluigi.derosa@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@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@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@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@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

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@lists.gfoss.it> Per conto di Massimiliano Moraca
Inviato: venerdì 26 luglio 2019 10:56
A: pierluigi de rosa <pierluigi.derosa@gmail.com>
Cc: GFOSS.it <gfoss@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 :slight_smile:

Il giorno ven 26 lug 2019 alle ore 10:45 pierluigi de rosa < pierluigi.derosa@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@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@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@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@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@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

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 <umbertofilippo@tiscali.it> 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 <gfoss-bounces@lists.gfoss.it> Per conto di Massimiliano Moraca
Inviato: venerdì 26 luglio 2019 10:56
A: pierluigi de rosa <pierluigi.derosa@gmail.com>
Cc: GFOSS.it <gfoss@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 :slight_smile:

Il giorno ven 26 lug 2019 alle ore 10:45 pierluigi de rosa <
pierluigi.derosa@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@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@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@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@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@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