2014-05-15 9 views
1

Я попытался решения из следующих сообщений:Джанго ModelForm не сохранение данных

Saving data from ModelForm: Не работает

ModelForm data not saving django: Не работает.

Я пытаюсь сохранить данные из ModelForm в модель.

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) 

Шаблон:

<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'), 

Однако, на редирект, он не сохраняет форму в модели, которые я проверяю с обеих PHPMyAdmin (с использованием MySQLDb) и панель администратора Django , Любая идея почему?

ответ

2

Вы используете POSTING до /testimonials/thanks/, который должен быть изменен на ваш add_testimonial маршрут, чтобы ваш просмотр обрабатывал POST. Таким образом, решение заключается в изменении значения action в теге формы вашего шаблона.

Если вы можете опубликовать соответствующий код из urls.py, я могу предоставить более конкретный ответ о том, каково должно быть значение атрибута действия.

Update

Перенаправление будет происходить с вашей точки зрения, когда действительная форма вывешенным. Изменение значения атрибута действия вашего шаблона для:

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

На ваш взгляд:

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

И убедитесь, что вы включаете следующий импорт в вашей точки зрения:

from django.core.urlresolvers import reverse 

Update 2

Показать ошибки в вашей временной форме поздно:

<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> 

Update 3

Теперь, когда вы можете увидеть свои ошибки формы, вам нужно будет предоставить ваше значение по умолчанию для скрытого поля, и нет никакой необходимости, чтобы сделать это, если в ChoiceField у пользователя нет выбора (он скрыт!).Таким образом, изменить поле verified форму по адресу:

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

Кроме того, было бы хорошая идея, чтобы проверить значение в вашей точке зрения, так как даже если поле скрыто, предприимчивые, злой пользователь может еще POST других значений.

+0

Добавил urls.py. Кроме того, мой исходный код имел действие как «add_listing». Это было сохранено в модели, но я хотел перенаправить на другой URL-адрес на успех, поэтому я изменил действие на 'отзывы/благодарности' – Newtt

+0

Отлично, я обновил свой ответ. Дайте мне знать, как вы ладите. – Fiver

+0

И любые изменения, которые необходимо внести в views.py? Потому что я пробовал это и не было никакого эффекта. Он не перенаправлялся на «отзывы/благодарности /». Если это помогает, мои данные формы в консоли выглядят следующим образом: 'verified:' 'name: Save' ' credentials: Save' 'test: Save' ' submit: Добавить отзыв' – Newtt

Смежные вопросы