#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. Добавление токена и отображение любых ошибок должны показать вам, что происходит не так.