2013-04-19 1 views
0

J'essaie de comprendre les CBV. Ici, j'utilise le CreateView pour fournir à mon modèle un formulaire pour créer de nouveaux modèles (via POST). Lorsque je fournis le formulaire avec des données valides, il le soumet et revient à la même page que si le formulaire comportait des erreurs, mais ce n'est pas le cas. Aucune erreur n'est affichée lorsque la page est actualisée après le POST HTTP. Je sais que la validation fonctionne parce que j'ai des scénarios de test où je ne fournis pas certaines données dans le champ de formulaire approprié a un message d'erreur qui lui est associé. Je vérifie la base de données et aucun enregistrement n'a été inséré. Ma base de données est correctement configurée. J'ai d'autres parties de l'application qui en lisent. La base de données a également toutes les migrations en cours appliquées via South. Je souhaite que quelqu'un puisse faire la lumière sur ce qui semble être une simple configuration fondamentale d'un CBV.Django 1.5 - CreateView ne crée pas/ne sauvegarde pas de nouveau modèle

Merci d'avance.

models.py

class Guide(models.Model): 
    DIFFICULTY_OPTIONS = (
     (u'1', u'Easy'), 
     (u'2', u'So so'), 
     (u'3', u'Moderate'), 
     (u'4', u'Challenging'), 
     (u'5', u'Very challenging'), 
    ) 
    title = models.CharField(max_length=100, db_index=True) 
    slug = models.SlugField(max_length=100) 
    description = models.CharField(max_length=500) 
    user = models.ForeignKey(User)  
    difficulty = models.CharField(max_length=1, choices=DIFFICULTY_OPTIONS, default=u'1', null=True, blank=True) 
    created = models.DateTimeField(default=datetime.datetime.now(), editable=False) 
    modified = models.DateTimeField(default=datetime.datetime.now()) 
    publish = models.BooleanField(default=False) 
    delete = models.BooleanField(default=False) 

forms.py

class NewGuideForm(forms.ModelForm): 
    title = forms.CharField(widget=forms.widgets.TextInput(attrs={'placeholder': 'Title', 
                   'class': 'input-block-level'})) 
    description = forms.CharField(widget=forms.Textarea(attrs={'placeholder': 'Description', 
                  'rows': 8, 
                  'class': 'input-block-level'})) 

    class Meta: 
     model = Guide 
     exclude = ('user', 'slug', 'created', 'modified', 'publish', 'delete', 'modified',) 

views.py

class NewGuideView(CreateView): 

    model = Guide 
    form_class = NewGuideForm 
    template_name = "guides/guide_new.html" 
    success_url = "/" # Just to keep things simple, redirect to root. 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(NewGuideView, self).dispatch(*args, **kwargs) 

    def form_valid(self, form): 
     try: 
      Guide.objects.get(title=form.title) 
     except ObjectDoesNotExist: 
      return super(NewGuideView, self).form_valid(form) 
     return super(NewGuideView, self).form_invalid(form) 

urls.py

url(r'^guides/new/$', guide.NewGuideView.as_view(), name='guide-new'), 

guides/guide_new.html

... 
<form method="post">{% csrf_token %} 
    {{ form.non_field_errors }} 
    <p>First, let's start by entering a title.</p> 
    <p>{{ form.title.errors }}</p> 
    <p>{{ form.title }}</p> 
    <p>Now, provide a short summary of the problem you will be solving.</p> 
    <p>{{ form.description.errors }}</p> 
    <p>{{ form.description }}</p> 
    <p>On a scale of 1 to 5, 5 being the most difficult, how hard is this?</p> 
    <p>{{ form.difficulty.errors }}</p> 
    <p>{{ form.difficulty }}</p> 
    <button type="submit" class="btn-password btn btn-send">Submit</button> 
</form> 
... 

Répondre

0

Je pense que vous devez vous référer au champ title comme form.cleaned_data['title'] plutôt que form.title. Les valeurs de champ valides soumises sont en form.cleaned_data dict.

changer donc votre code comme

def form_valid(self, form): 
    try: 
     Guide.objects.get(title=form.cleaned_data['title']) 
    except ObjectDoesNotExist: 
     return super(NewGuideView, self).form_valid(form) 
    return super(NewGuideView, self).form_invalid(form) 

Évaluation form.title entraînera AttributeError qui ne sont pas traitées dans votre méthode.

+0

Oui, c'était une erreur de ma part - résultat d'un codage en fin de soirée. Cependant, après avoir corrigé cela, je n'ai toujours pas réussi à surmonter mon problème. J'ai placé une instruction d'impression directement dans la ligne d'ouverture de ma méthode form_valid et rien n'est imprimé. Donc ce n'est même pas appelé. –

+0

@DanielMartin, ligne dans urls.py 'guide.NewGuideView.as_view()' ne semble pas approprié. Je ne pense pas qu'il a besoin de «guide». – Rohan

+0

J'ai mes opinions divisées en différents modules à des fins d'organisation. Donc, j'ai un dossier "views" avec un __init__.py défini, qui importe les différents modules de vue. Je sais que ce n'est pas le problème. Retour à mon CBV, NewGuideView, si je mets une instruction d'impression à l'intérieur de la méthode de répartition substituée, les choses sont imprimées. Pour une raison quelconque, form_valid n'est pas invoqué. –

Questions connexes