2012-06-17 15 views
6

Soy un verdadero principiante en el desarrollo web. El siguiente código está fallando en el cheque is_valid(). Pero no entiendo por qué: ¿El formulario debe obtener sus datos llenos de los datos POST o no?Forma Django is_valid() falla

Modelo:

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(), 
     } 

función de Vista:

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

he encontrado temas similares y probado un montón. Así es como creo que debería funcionar. Realmente necesito un consejo.

+4

Ir a las preguntas anteriores que usted ha preguntado y aceptar la mejor respuesta (si éstos es uno) para una pregunta en particular. Puede hacer esto colocando la marca de verificación al lado de una respuesta. –

Respuesta

5

Se requiere que todos los campos de su modelo. Entonces, form.is_valid() será verdadero, si todos los campos están llenos con los valores correctos y no están en blanco. Ha declarado los campos time, user, views como campos ocultos. ¿Estás seguro de que los has llenado en tu plantilla? Además, es posible que desee sellar automáticamente el campo time = models.DateField(). Modifique su campo de modelo como

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

Después de esto, no tiene que rellenarlo usted mismo en forma de plantilla.

Su vista debe devolver el objeto HttpResponse en todos los casos. Si su formulario no es válido, es decir, si form.is_valid() devolverá False, la vista no devolverá ningún objeto HttpResponse. Esta puede ser la fuente de tu falla. Añadir else declaración para 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

Gracias, esto es claramente una mejora de mi código. Para mi base de datos necesito la fecha en este formato: d.strftime ("% Y-% m-% d% H:% M:% S"). ¿Sería posible inicializar la fecha en el modelo dado un formato especial como el mío? – JoeFox

+1

Cuando 'auto_now' se usa para' DateField', el objeto 'datetime.date' con la fecha actual se pasa como valor. Y cuando necesite leer 'DateField', puede elegir cualquier formato que desee. Además, hasta donde sé, 'DateField' almacenará solo la fecha, es decir, solo esta parte'% Y-% m-% d'. Si necesita almacenar fecha y hora, entonces debe usar 'DateTimeField'. Mire [DateField] (https://docs.djangoproject.com/en/dev/ref/models/fields/#datefield) y [DateTimeField] (https://docs.djangoproject.com/en/dev/ref/models/fields/# datetimefield). – stalk

2

cambiar esta línea:

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

Por esta:

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

Gracias, esto hizo el trabajo por mí. – JoeFox

+2

espera, ¿cuál es la diferencia entre los dos? Quiero decir, puedo ver el Request.POST perdido ... pero ¿cómo ayuda eso? – bharal

Cuestiones relacionadas