web-dev-qa-db-fra.com

Django ajouter un champ supplémentaire à un ModelForm généré à partir d'un modèle

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.

51
Marco Fedele

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

64
relekang

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)
5
ZG101