I am a real beginner in web development. The following code is failing at the is_valid() check. But I do not understand why: The form should get its data filled from the POST-data or not?
Model:
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(),
}
View function:
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))
I found similar topics and tried a lot. This is how i think it should work. I really need advice.
All fields of your model are required. So,
form.is_valid()will be True, if all fields are filled with correct values and are not blanked.You have declared fields
time,user,viewsas hidden fields. Are you sure, that you have filled them in your template form?Also, you may want to auto stamp field
time = models.DateField(). Modify your model field likeAfter this you don’t have to fill it by yourself in template form.
Your view must return HttpResponse object in all cases. If your form is not valid, i.e. if
form.is_valid()will return False, then noHttpResponseobject will be returned by your view. This can be the source of your fail. Addelsestatement forif form.is_valid():