2010-10-29 15 views
1

Comment pourrions-nous rendre la forme de django non valide si nous modifions, pas en ajoutant un nouvel enregistrement. Le code comme suit:Comment valider le formulaire django uniquement en ajoutant ne pas éditer

class PageForm(forms.Form): 
    name = forms.CharField(max_length=100,widget=forms.TextInput(attrs={'class':'textInput'})) 
    description = forms.CharField(max_length=300, required=False,widget=forms.TextInput(attrs={'class':'textInput'})) 
    body = forms.CharField(widget=forms.Textarea) 
    template = forms.CharField(max_length=30,widget=forms.TextInput(attrs={'class':'textInput'})) 
    navbar = forms.BooleanField(required=False, widget=forms.Select(choices=(('True','True'), 
                      ('False', 'False')))) 
    publish = forms.BooleanField(widget=forms.Select(choices=(('Published','Publish Now'), 
                   ('Private','Private'), 
                   ('Draft','Draft')))) 

    def save(self, page=None, commit=True): 
     data = self.cleaned_data 
     if not page: 
      page = models.Page(key_name=data['name'].replace(' ','-')) 
     page.name = data['name'] 
     page.description = data['description'] 
     page.body = data['body'] 
     page.template = data['template'] 
     page.publish = data['publish'] 
     if commit: page.put() 
     return page 


    # prevent the same page 's name 
    def clean_name(self): 
     name = self.cleaned_data['name'] 
     query = models.Page.all(keys_only=True) 
     query.filter('name = ', name) 

     page = query.get() 

     if page: 
      raise forms.ValidationError('Page name "%s" was already used before' % name) 

     return name 

Le but de cette validation de nom est d'empêcher les enregistrements portant le même nom. BUt je l'ai trouvé, il valide aussi sur edit, donc nous ne pouvions pas éditer les enregistrements, puisqu'il dira que 'les enregistrements avec le même nom existent déjà'.

En fait, pour l'édition, la fonction de sauvegarde de la page ne sera pas, mais l'enregistrement précédent à la place, et ne sera pas en enregistrer un nouveau. Mais comment nous lisons ce param, sur la fonction clean_name afin que nous puissions maintenant savoir si c'est l'édition ou la création?

Merci beaucoup!

+0

Quelle que soit la raison pour laquelle vous n'utilisez pas ModelForm pour générer le formulaire à partir du modèle Page à la place? Avec key_name comme unique SlugField – sunn0

Répondre

0

dans votre fonction clean_name exclure l'objet actuel de queryset

query.filter('name = ', name).exclude(pk=self.pk) 

ou modifier la condition if pour vérifier cette page et de l'objet en cours ne sont pas les mêmes.

2

Si vous modifiez le formulaire, le formulaire comporte une instance et vous pouvez vérifier s'il existe.

Si c'est le cas, alors vous êtes probablement en train d'éditer l'objet existant .. non?

Exemple: Si vous objet éditez avec la forme, vous créez objet forme un peu comme ceci:

form = MyForm(instance = myobject) 

Ensuite, dans vos méthodes de classe de formulaire, vous pouvez vérifier si le formulaire est enregistrée par exemple d'une manière qu'il est décrit ici: Test if Django ModelForm has instance

+0

pourquoi n'est-ce pas la réponse? – Atma

0

Désolé, je ne peux pas commenter ci-dessous vos gars post, ne sais pas pourquoi.

@ sunn0: Je n'ai pas utilisé de modèles django, coz déployer l'application dans appengine, donc utiliser le modèle appengine à la place.

@Zayatzz: Pouvez-vous montrer un petit code comment le faire? Depuis que nous sommes en train d'ajouter ou de modifier, nous avons toujours lié le formulaire à request.POST avant la validation, donc nous ne savons pas comment différencier.

@Ashok: J'ai fait une solution de contournement basée sur votre suggestion. Comme précédemment, je n'ai pas passé le pk à former, mais en passant l'objet prev en tant que param, je ne pouvais donc pas l'exclure en utilisant pk. Donc, je change le code et mets la clé additionnelle comme pk (si créer, laisse la clé vide, mais si édite la clé de remplissage avec pk) et vérifie juste si condition, si la clé n'est pas vide, cela signifie que nous éditons. Je ne sais pas si c'est la meilleure pratique, mais ça marche quand même.