with - Django agrega un campo adicional a un ModelForm generado a partir de un Modelo
django forms without model (2)
Para hacer un seguimiento de la respuesta de relekang, tuve que recordarle que también return la última línea como se muestra, de modo que el método get_absolute_url () del objeto se pueda invocar automáticamente al momento del envío del formulario:
return super(PointForm, self).save(commit=commit)
Tengo que generar un FormSet a partir de un modelo, pero necesito insertar un "valor extra" en cada formulario.
Específicamente, tengo un JApplet que genera algunos Marcadores y Rutas en una imagen, y POST en el servidor.
En mi modelo, las líneas están compuestas por dos marcadores. Pero cuando lo publico, porque estoy usando el id. Generado desde JApplet y no desde la base de datos, no sabré de qué marcadores se compondrá una ruta.
Así que pensé en insertar una "Identificación temporal" en el Marcador en el formulario, y hacer los arreglos correctos en la vista antes de guardar la Ruta.
Pensé en definir un formulario personalizado para los marcadores, pero no parece ser muy SECO, y no quiero volver a esto si cambio el modelo de Marker.
Aquí está la forma:
class PointForm(forms.ModelForm):
temp_id = forms.IntegerField()
class Meta:
model = Point
def clean(self):
if any(self.errors):
# Don''t bother validating the formset unless each form is valid on its own
return
ingresso = self.cleaned_data[''ingresso'']
ascensore = self.cleaned_data[''ascensore'']
scala = self.cleaned_data[''scala'']
if (ingresso and ascensore) or (ingresso and scala) or (ascensore and scala):
raise forms.ValidationError("A stair cannot be a elevator or an access!!!")
return self
def save(commit=True):
# do something with self.cleaned_data[''temp_id'']
super(PointForm).save(commit=commit)
Y el modelo:
class Point(models.Model):
RFID = models.CharField(max_length=200, blank=True)
x = models.IntegerField()
y = models.IntegerField()
piano = models.ForeignKey(Floor)
ingresso = models.BooleanField()
El error:
ViewDoesNotExist at /admin/
Could not import buildings.views.getFloors. View does not exist in module buildings.views.
Request Method: GET
Request URL: http://127.0.0.1:8000/admin/
Django Version: 1.4.1
Exception Type: ViewDoesNotExist
Exception Value:
Could not import buildings.views.getFloors. View does not exist in module buildings.views.
Exception Location: /usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py in get_callable, line 101
El error se genera cuando intento cargar la página de administración, esta página no tiene referencias en absoluto con el formulario.
SOLUCIÓN PARA EXCEPCIÓN
Bien, escribiré aquí cómo averiguar por qué Django estaba haciendo algo tan extraño.
Here es una forma correcta de descubrir cuál es el problema.
La excepción fue lanzada porque olvidé agregar forms.py
a los from django import forms
.
Puede agregar un campo a un ModelForm. A menos que agregue un campo llamado temp_id a su modelo, no necesita cambiar este formulario cuando cambie su modelo.
Ejemplo (con un modelo llamado Point):
class PointForm (forms.ModelForm):
temp_id = forms.IntegerField()
class Meta:
model = Point
def save(self, commit=True):
# do something with self.cleaned_data[''temp_id'']
return super(PointForm, self).save(commit=commit)
ACTUALIZACIÓN: se olvidó de sí mismo en def save () y cambió el nombre del modelo a Point