форма.save() не сохраняется

#python #django #django-forms

#python #django #django-формы

Вопрос:

По какой-то причине я не могу получить form.save() для сохранения в моей базе данных. Я могу создать форму и передать ее саму моему шаблону, но в базе данных ничего не сохраняется. Я возился с ним много часов и не смог заставить его работать.

Приветствуется любая помощь.

Вот соответствующий код..

Это мой add/model.py

 from django.db import models
from django.forms import ModelForm

class addTask(models.Model):
    task = models.CharField('Task',  max_length=60)
    taskNotes = models.CharField('Notes', max_length=600)

    def __unicode__(self):
        return self.task

class addTaskForm(ModelForm):
    class Meta:
        model = addTask
  

template/addTHEtask.html . На это правильно ссылаются.

     <form action="/todo/" method="post">
    {{ form.as_p }}
    <input type="submit" value="Add Task" />
    </form>
  

add/views.py

 from django.shortcuts import render_to_response
from django.template import RequestContext
from myToDo.add.models import addTask, addTaskForm

def create_task(request):
    if request.method == 'POST':
        form = addTaskForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = addTaskForm()
    return render_to_response('addTHEtask.html', {'form': form})
  

Комментарии:

1. вы уверены, что форма проверяется и что form.save() определенно вызывается? Кроме того, по опубликованному вами коду трудно сказать, но правильно ли указан отступ класса Meta, т.Е. это внутренний класс addTaskForm? Наконец, в качестве отступления, принято называть ваши классы и формы с большой буквы; AddTask и AddTaskForm

2. И вы уверены, что сохраняете данные в базе данных? (т. Е. вы забыли зафиксировать транзакцию?)

3. Что сказал @pastylegs — и один из способов это проверить, это добавить переменную {{ form.errors }} в ваш шаблон, посмотрите, что отображается.

4. Как сказал pastylegs, убедитесь, что у вас все расставлено правильно. То, что вы опубликовали здесь, имеет неверный отступ.

5. не связано, но вы должны использовать токен csrf для лучшей безопасности. docs.djangoproject.com/en/dev/ref/contrib/csrf

Ответ №1:

Для правильной отладки вашего кода измените свой шаблон на:

 <form action="/todo/" method="post"> {{ csrf_token }}
    {{ form.errors }}
    {{ form.as_p }}
    <input type="submit" value="Add Task" />
</form>
  

И ваш взгляд на:

 def create_task(request):
    if request.method == 'POST':
        form = addTaskForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = addTaskForm()
    return render_to_response(
                     'addTHEtask.html', 
                     {'form': form}, 
                     context_instance=RequestContext(request))
  

Я не думаю, что context_instance сделает для вас что-то существенное, но обычно это правильная передача при использовании render_to_response .

Отображение ошибок в форме может помочь вам отследить, в чем заключается реальная проблема. Ваш код выглядит (в основном) корректно, за исключением отсутствующего csrf_token. Добавление токена и отображение любых ошибок должны показать вам, что происходит не так.