Форма Django is_valid () не работает

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

Модель:

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

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

 Simeon Visser20 июн. 2012 г., 12:02
Перейдите к ранее заданным вопросам и примите наилучший ответ (если он один) на конкретный вопрос. Вы можете сделать это, поставив галочку рядом с ответом.

Ответы на вопрос(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})
 27 авг. 2018 г., 11:00
Вы должны объяснить, почему это работает
 JoeFox17 июн. 2012 г., 16:53
Спасибо, это сделало всю работу за меня.
 26 сент. 2012 г., 20:01
подожди, а какая разница между этими двумя? Я имею в виду, я вижу, что Request.POST отсутствует ... но как это поможет?
 18 мар. 2019 г., 16:16
Чтобы ответить @bharal -new() Метод имеет условный характер. Начинается сif request.method == 'POST': process the data... тогда естьelse (если способ не являетсяPOSTто есть, если этоGET). Если это неPOST метод, то почему бы вам включитьrequest.POST (который не мог бы существовать здесь послеelse)?
Решение Вопроса

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

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

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

Your view must return HttpResponse object in all cases, Если ваша форма недействительна, то есть еслиform.is_valid() вернет Ложь, тогда нет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
 JoeFox18 июн. 2012 г., 07:38
Спасибо, это явно улучшение моего кода. Для моей базы данных мне нужна дата в следующем формате: d.strftime (& quot;% Y-% m-% d% H:% M:% S & quot;). Можно ли инициализировать дату в модели с помощью специального формата, такого как мой?
 18 июн. 2012 г., 08:34
когдаauto_now используется дляDateField,datetime.date объект с текущей датой передается как значение. И когда вам нужно прочитатьDateFieldВы можете выбрать любой формат, который вам нравится. Кроме того, насколько я знаю,DateField будет хранить только дату, то есть только эту часть%Y-%m-%d, Если вам нужно сохранить дату и время, то вы должны использоватьDateTimeField, ПосмотритеDateField а такжеDateTimeField.

Ваш ответ на вопрос