Je dois générer un FormSet à partir d'un modèle mais j'ai besoin d'insérer une "valeur supplémentaire" dans chaque formulaire.
Plus précisément, j'ai un JApplet qui génère des marqueurs et des chemins sur une image, et POST il sur le serveur.
Dans mon modèle, les lignes sont composées de deux marqueurs. Mais quand je POST it, parce que j'utilise l'identifiant généré à partir de la JApplet et non à partir de la base de données, je ne saurai pas à partir de quels marqueurs un chemin sera composé.
J'ai donc pensé insérer un "identifiant temporaire" sur le marqueur sur le formulaire, et faire les arrangements corrects dans la vue avant d'enregistrer le chemin.
J'ai pensé à définir un formulaire personnalisé pour les marqueurs, mais il ne semble pas être très SEC, et je ne veux pas y revenir si je change le modèle de marqueur.
Voici le formulaire:
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)
Et le modèle:
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()
L'erreur:
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
L'erreur est générée lorsque j'essaie de charger la page d'administration, cette page n'a aucune référence avec le formulaire.
SOLUTION D'EXCEPTION
Ok, je vais écrire ici comment découvrir pourquoi Django faisait une chose si étrange.
Ici c'est une façon correcte de découvrir quel est le problème.
L'exception a été levée car j'ai oublié d'ajouter forms.py
au from Django import forms
.
Vous pouvez ajouter un champ à un ModelForm. Sauf si vous ajoutez un champ nommé temp_id à votre modèle, vous n'avez pas besoin de modifier ce formulaire lorsque vous modifiez votre modèle.
Exemple (avec un modèle nommé 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)
MISE À JOUR: Soi oublié dans def save () et changé le nom du modèle en Point
Pour suivre la réponse de relekang, j'ai dû me rappeler aussi return la dernière ligne comme indiqué, afin que la méthode get_absolute_url () de l'objet puisse être automatiquement appelée lors de la soumission du formulaire:
return super(PointForm, self).save(commit=commit)