2012-06-17 2 views
6

Я настоящий начинающий разработчик веб-разработки. Следующий код не работает при проверке is_valid(). Но я не понимаю, почему: Форма должна заполнять свои данные из POST-данных или нет?Django form is_valid() не работает

Модель:

class Statement(models.Model): 
    text = models.CharField(max_length=255) 
    user = models.ForeignKey(User) 
    time = models.DateField() 
    views = models.IntegerField() 

ModelForm:

class StatementForm(ModelForm): 
    class Meta: 
     model = Statement 
     widgets = { 
        'time':forms.HiddenInput(), 
        'user':forms.HiddenInput(), 
        'views':forms.HiddenInput(), 
     } 

Вид функции:

def new(request): 
    if request.method == 'POST': # If the form has been submitted... 
     form = StatementForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): 
      stmt = form.save() 
      path = 'stmt/' + stmt.id 
      return render_to_response(path, {'stmt': stmt}) 
    else: 
     c = {} 
     c.update(csrf(request)) 
     loggedin_user = request.user 
     d = datetime.now() 
     form = StatementForm(request.POST, initial={'time': d.strftime("%Y-%m-%d %H:%M:%S"), 'user':loggedin_user, 'views':0}) 
     return render_to_response('new_stmt.html', {'form': form, },context_instance=RequestContext(request)) 

я нашел подобные темы и попробовал много. Вот как я думаю, он должен работать. Мне действительно нужен совет.

+4

Перейти к ранее вопросам, которые вы просили и принять лучший ответ (если они есть) для конкретного вопроса. Вы можете сделать это, поставив галочку рядом с ответом. –

ответ

5

необходимы все поля вашей модели. Таким образом, form.is_valid() будет True, если все поля заполнены с правильными значениями и не будут заполнены. Вы указали поля time, user, views как скрытые поля. Вы уверены, что вы заполнили их в своей форме? Кроме того, вы можете указать поле автоматической печати time = models.DateField(). Измените поле своей модели, например

time = models.DateField(auto_now=True)`. 

После этого не нужно заполнить его самим в виде шаблона.

Ваше представление должно возвращать объект HttpResponse во всех случаях. Если ваша форма недействительна, то есть если form.is_valid() вернет False, то объект HttpResponse будет возвращен вашим представлением. Это может быть источником вашей неудачи. Добавить else заявления для if form.is_valid():

from django.http import Http404 
def new(request): 
    if request.method == 'POST': # If the form has been submitted... 
     form = StatementForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): 
      stmt = form.save() 
      path = 'stmt/' + stmt.id 
      return render_to_response(path, {'stmt': stmt}) 
     else: 
      # Do something in case if form is not valid 
      raise Http404 
    else: 
     # Your code without changes 
+0

Спасибо, это явно улучшение моего кода. Для моей базы данных мне нужна дата в этом формате: d.strftime («% Y-% m-% d% H:% M:% S»). Можно ли инициализировать дату в модели, учитывая специальный формат, такой как мой? – JoeFox

+1

Когда 'auto_now' используется для' DateField', объект 'datetime.date' с текущей датой передается как значение. И когда вам нужно прочитать 'DateField', вы можете выбрать любой формат, который вам нравится. Кроме того, насколько я знаю, 'DateField' будет хранить только дату, т. Е. Только эту часть'% Y-% m-% d'. Если вам нужно сохранить дату и время, вы должны использовать 'DateTimeField'. Посмотрите [DateField] (https://docs.djangoproject.com/en/dev/ref/models/fields/#datefield) и [DateTimeField] (https://docs.djangoproject.com/en/dev/ref/models/поля/# DateTimeField). – stalk

2

Изменить эту строку:

form = StatementForm(request.POST, initial={'time': d.strftime("%Y-%m-%d %H:%M:%S"), 'user':loggedin_user, 'views':0}) 

Для этого:

form = StatementForm(initial={'time': d.strftime("%Y-%m-%d %H:%M:%S"), 'user':loggedin_user, 'views':0}) 
+0

Спасибо, это работало для меня. – JoeFox

+2

Подождите, какая разница между ними? Я имею в виду, я вижу, что Request.POST отсутствует ... но как это помогает? – bharal

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