[Gfoss] geodjango inserire campo geom da form

Ciao a tutti, per un'applicazione web stiamo testando geodjango.
Abbiamo diversi problemini, ma per ora mi concentro su uno solo:
abbiamo una form per l'inserimento dati a cui vengono passati est e
nord di alcuni punti, durante il salvataggio della form creiamo il
campo geometrico da inserire ma alla fine sul database rimane null,
ecco il codice che usiamo nella views (come potete vedere abbiamo
fatto la prova sia con geos che con ogr ma il risultato è uguale)

def insertPlace(request):
  if request.method == 'POST':
      form = InsertPlaceForm(request.POST)
      if form.is_valid():
        #pnt = OGRGeometry('POINT (' + str(form.cleaned_data["east"])
+ ' ' + str(form.cleaned_data["north"]) + ')', srs=4326)
        pnt = Point(float(form.cleaned_data["east"]),
float(form.cleaned_data["north"]))
        pnt.srid = 4326
        form.cleaned_data["geom"] = pnt
        form.save()
        return HttpResponseRedirect('/acesap_webgis/webgis/')
  else:
      form = InsertPlaceForm() # An unbound form
  return render_to_response("insertplace.html", {"formm": form})

ciao
Luca

Il 24 novembre 2010 20:04, Paolo Corti <pcorti@gmail.com> ha scritto:

2010/11/24 Luca Delucchi <lucadeluge@gmail.com>:

Ciao a tutti, per un'applicazione web stiamo testando geodjango.
Abbiamo diversi problemini, ma per ora mi concentro su uno solo:
abbiamo una form per l'inserimento dati a cui vengono passati est e
nord di alcuni punti, durante il salvataggio della form creiamo il
campo geometrico da inserire ma alla fine sul database rimane null,
ecco il codice che usiamo nella views (come potete vedere abbiamo
fatto la prova sia con geos che con ogr ma il risultato è uguale)

conviene che manchi anche il modello e il form (penso che sia li ad
una prima occhiata il malfunzionamento)
appena posso cerco di darti una mano

ecco modello e form

class Sites(models.Model):
    id_sites = models.AutoField(primary_key=True)
    east = models.DecimalField(max_digits=11, decimal_places=8) # was
65535 for both
    north = models.DecimalField(max_digits=11, decimal_places=8)
    height = models.DecimalField(max_digits=6, decimal_places=2)
    sitename = models.TextField()
    geom = gismodels.PointField(srid=4326) # This field type is a
guess. Was models.TextField
    notes = models.TextField()
    objects = gismodels.GeoManager()
    class Meta:
        db_table = u'sites'

class InsertPlaceForm(ModelForm):
  #id_sites = IntegerField(widget=HiddenInput,required=True)
  #geom = gismodels.PointField(required=False) # NOT WORKING.
  class Meta:
    model = Sites
    exclude = ('geom',)

ciao
P

ciao
Luca

Quoting Luca Delucchi <lucadeluge@gmail.com>:

Il 24 novembre 2010 20:04, Paolo Corti <pcorti@gmail.com> ha scritto:
> 2010/11/24 Luca Delucchi <lucadeluge@gmail.com>:
>> Ciao a tutti, per un'applicazione web stiamo testando geodjango.
>> Abbiamo diversi problemini, ma per ora mi concentro su uno solo:
>> abbiamo una form per l'inserimento dati a cui vengono passati est e
>> nord di alcuni punti, durante il salvataggio della form creiamo il
>> campo geometrico da inserire ma alla fine sul database rimane null,
>> ecco il codice che usiamo nella views (come potete vedere abbiamo
>> fatto la prova sia con geos che con ogr ma il risultato è uguale)
>>
>
> conviene che manchi anche il modello e il form (penso che sia li ad
> una prima occhiata il malfunzionamento)
> appena posso cerco di darti una mano

ecco modello e form

class Sites(models.Model):
    id_sites = models.AutoField(primary_key=True)
    east = models.DecimalField(max_digits=11, decimal_places=8) # was
65535 for both
    north = models.DecimalField(max_digits=11, decimal_places=8)
    height = models.DecimalField(max_digits=6, decimal_places=2)
    sitename = models.TextField()
    geom = gismodels.PointField(srid=4326) # This field type is a
guess. Was models.TextField
    notes = models.TextField()
    objects = gismodels.GeoManager()
    class Meta:
        db_table = u'sites'

class InsertPlaceForm(ModelForm):
  #id_sites = IntegerField(widget=HiddenInput,required=True)
  #geom = gismodels.PointField(required=False) # NOT WORKING.

Perché PointField sta sotto gismodels? Dovresti avere all'inizio

from django.contrib.gis.db import models

e tutti i tipi di Field derivano da quello. O no?

Ciao
steko

--
Stefano Costa
http://www.iosa.it/ Open Archaeology

Il 24 novembre 2010 23:39, Stefano Costa <steko@iosa.it> ha scritto:

class InsertPlaceForm(ModelForm):
#id_sites = IntegerField(widget=HiddenInput,required=True)
#geom = gismodels.PointField(required=False) # NOT WORKING.

Perché PointField sta sotto gismodels? Dovresti avere all'inizio

se ti riferisci a questo sopra è commentanto e non funziona...

Ciao
steko

ciao
Luca

Quoting Luca Delucchi <lucadeluge@gmail.com>:

se ti riferisci a questo sopra è commentanto e non funziona...

    geom = gismodels.PointField(srid=4326) # This field type is a guess. Was
models.TextField
    notes = models.TextField()
    objects = gismodels.GeoManager()

Idem come sopra (se non ho visto il commento forse però sono un po' stanco)

Ciao
steko

--
Stefano Costa
http://www.iosa.it/ Open Archaeology

Caro Luca
come spiegato BENE :wink: sulla documentazione di Django [1] (leggi la nota):

"If you specify fields or exclude when creating a form with ModelForm,
then the fields that are not in the resulting form will not be set by
the form's save() method. Django will prevent any attempt to save an
incomplete model, so if the model does not allow the missing fields to
be empty, and does not provide a default value for the missing fields,
any attempt to save() a ModelForm with missing fields will fail. To
avoid this failure, you must instantiate your model with initial
values for the missing, but required fields..."

pertanto puoi usare uno dei due modi suggeriti, ad es modificando
cosi' la tua view, vedrai che ti funziona:

if form.is_valid():
            pnt =
Point(float(form.cleaned_data["east"]),float(form.cleaned_data["north"]))
            pnt.srid = 4326
            place = form.save(commit=False)
            place.geom = pnt
            place.save()

[1] http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#using-a-subset-of-fields-on-the-form

ciao
P

--
Paolo Corti
GIS specialist and web developer
web: http://www.paolocorti.net
twitter: @paolo_corti

2010/11/26 Paolo Corti <pcorti@gmail.com>:

Caro Luca
come spiegato BENE :wink: sulla documentazione di Django [1] (leggi la nota):

eh grazie, me l'ero perso!!

"If you specify fields or exclude when creating a form with ModelForm,
then the fields that are not in the resulting form will not be set by
the form's save() method. Django will prevent any attempt to save an
incomplete model, so if the model does not allow the missing fields to
be empty, and does not provide a default value for the missing fields,
any attempt to save() a ModelForm with missing fields will fail. To
avoid this failure, you must instantiate your model with initial
values for the missing, but required fields..."

pertanto puoi usare uno dei due modi suggeriti, ad es modificando
cosi' la tua view, vedrai che ti funziona:

si si funziona grazie mille!!

ciao
P

ciao
Luca