2014-05-15 6 views
1

j'ai essayé des solutions des postes suivants:Django ModelForm pas de sauvegarde des données

Saving data from ModelForm: N'a pas travaillé

ModelForm data not saving django: Ça n'a pas marché. J'essaie d'enregistrer des données à partir d'un ModelForm dans le modèle.

models.py:

class Testimonials(models.Model): 
    name = models.CharField(max_length=128) 
    credentials = models.CharField(max_length=128) 
    test = models.CharField(max_length=2000) 
    id = models.AutoField(primary_key=True) 
    NO = 'NO' 
    YES = 'YES' 
    APPROVAL = ((NO, 'no'), (YES, 'yes')) 
    verified = models.CharField(choices=APPROVAL, default=NO, max_length=3) #Field for making sure only verified testimonials are displayed 

    def __unicode__(self): 
     return self.id 

forms.py:

class TestimonialForm(forms.ModelForm): 
    name = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control input-area', 'placeholder': 'Enter your name'}), required=True) 
    credentials = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control input-area', 'placeholder': 'Enter your designation'}), required=True) 
    test = forms.CharField(widget=forms.Textarea(attrs={'class': 'form-control test-form-area', 'placeholder': 'Testimonial', 'rows': '5'}), required=True) 
    verified = forms.ChoiceField(widget=forms.HiddenInput()) 

    class Meta: 
     model = Testimonials 

views.py

def add_testimonial(request): 
    context = RequestContext(request) 
    if request.method == 'POST': 
     form = TestimonialForm(request.POST) 

     if form.is_valid(): 
      form.save(commit=True) 
      return HttpResponseRedirect('/testimonials/thanks/') 
     else: 
      print form.errors 

    else: 
     form = TestimonialForm() 

    return render_to_response('templates/add_testimonial.html', {'form': form}, context) 

Modèle:

<form id="testimonial_form" method="POST" action="/testimonials/thanks/"> 
    {% csrf_token %} 
    {% for hidden in form.hidden_fields %} 
     {{ hidden }} 
    {% endfor %} 
    {% for field in form.visible_fields %} 
     {{ field.help_text}} 
     {{ field }} 
    {% endfor %} 
    <input type="submit" name="submit" value="Add testimonial" class="btn btn-info test-button"/> 
</form> 

EDIT:

urls.py

url(r'^testimonials/all/', views.testimonials, name='testimonial'), 
url(r'^testimonials/thanks/', views.testimonials_thanks, name='testimonial_thanks'), 
url(r'^add_testimonial', views.add_testimonial, name='add_testimonial'), 

Cependant, redirect, il ne sauve pas la forme dans le modèle que je vérifie à la fois PHPMyAdmin (en utilisant un MySQLdb) et le panneau d'administration Django . Une idée pourquoi?

Répondre

2

Vous êtes POSTE à /testimonials/thanks/ qui doit être changé à votre route add_testimonial pour que votre vue gère le POST. Ainsi, la solution consiste à modifier la valeur action dans la balise de formulaire de votre modèle.

Si vous pouvez publier le code pertinent à partir de votre URL urls.py, je peux fournir une réponse plus précise quant à la valeur de l'attribut d'action.

Mise à jour

Redirect se produira dans votre point de vue quand un formulaire valide est affiché. Modifier la valeur de l'attribut action de votre modèle pour:

<form id="testimonial_form" method="POST" action="{% url 'add_testimonial' %}"> 

À votre avis:

if form.is_valid(): 
    form.save() 
    return HttpResponseRedirect(reverse('testimonial_thanks')) 

Et assurez-vous d'inclure l'importation suivante dans votre vue:

from django.core.urlresolvers import reverse 

Update 2

Afficher les erreurs de formulaire dans yo ur modèle:

<form id="testimonial_form" method="POST" action="{% url 'add_testimonial' %}"> 
    {% csrf_token %} 
    {% if form.non_field_errors %} 
     <div class="form-group text-error"> 
      {{ form.non_field_errors }} 
     </div> 
    {% endif %} 

    {% for hidden in form.hidden_fields %} 
     {{ hidden }} 
    {% endfor %} 
    {% for field in form.visible_fields %} 
     {{ field.help_text}} 
     {{ field }} 
     {% if field.errors %} 
      <span>{{ field.errors|striptags }}</span> 
     {% endif %} 
    {% endfor %} 
    <input type="submit" name="submit" value="Add testimonial" class="btn btn-info test-button"/> 
</form> 

Mise à jour 3

Maintenant que vous pouvez voir vos erreurs de formulaire, vous devrez fournir votre valeur par défaut au champ caché, et il n'y a pas besoin de faire un ChoiceField si l'utilisateur n'a pas le choix (c'est caché!).Donc, changer le champ de formulaire verified à:

verified = forms.CharField(widget=forms.HiddenInput(), initial='no') 

En outre, ce serait une bonne idée de vérifier la valeur de votre point de vue car, même si le champ est masqué, un entreprenant, l'utilisateur mal peut encore POST d'autres valeurs.

+0

Ajouté urls.py. En outre, mon code d'origine avait une action en tant que "add_listing". Cela a sauvé le modèle, mais je voulais rediriger vers une autre URL sur le succès, donc j'ai changé l'action en «testimonials/thanks's» – Newtt

+0

Super, j'ai mis à jour ma réponse. Dites-moi comment vous vous entendez. – Fiver

+0

Et les changements à faire dans le views.py? Parce que j'ai essayé cela et il n'y avait aucun effet. Il n'a pas redirigé vers 'testimonials/thanks /'. Si cela aide, mes données de formulaire dans la console est la suivante: 'vérifié:' 'nom: Enregistrer' ' credentials: Save' 'test: Save' ' soumettre: Ajouter un avis – Newtt

Questions connexes