2014-03-06 95 views
1

创建初始数据(CreateView)后,我继续更新更多数据(UpdateView),但在tring更新新数据时我得到以下答案。我附上的代码relvelant部分:Django CBV更新ValueError无法分配无

ValueError at /preinscripcion/padres/63 
Cannot assign None: "Alumni.cycle" does not allow null values. 
Request Method: POST 
Request URL: http://decroly.administracionescolarmexico.com/preinscripcion/padres/63 
Django Version: 1.5 
Exception Type: ValueError 
Exception Value:  
Cannot assign None: "Alumni.cycle" does not allow null values. 
Exception Location: /home/fbenavides/webapps/django/lib/python2.7/django/db/models/fields/related.py in __set__, line 401 
Python Executable: /usr/local/bin/python 
Python Version: 2.7.5 

Model.py

# -*- coding: utf-8 -*- 
# Create your models here 
from django.db import models 
from django.forms import ModelForm 
from django.conf import settings 
from django.core.files.storage import FileSystemStorage 
import os.path 
import datetime 

# Create your models here 
class ScholarCycle(models.Model): 
""" 
ScholarCycle 
Yearly School Cycle (e.g. 2012-2013) 
""" 
cycle = models.CharField(blank=False, max_length=9, verbose_name=u'Ciclo Escolar') 

def __unicode__(self): 
    return u'%s' % self.cycle 

class Meta: 
    db_table = u'Ciclo Escolar' 
    ordering = ['id', 'cycle'] 
    verbose_name = u'Ciclo Escolar' 
    verbose_name_plural = u'Ciclos Escolares' 

class Admin: 
    pass 

fs_photos = FileSystemStorage(location='/media/user/photos') 
fs_docs = FileSystemStorage(location='/media/user/docs') 

class Alumni(models.Model): 
""" 
""" 
cycle = models.ForeignKey(ScholarCycle, unique=False, null=False, blank=True, verbose_name=u'Ciclo Escolar') 

url.py

urlpatterns = patterns('', 
url(r'^lista/$', views.AlumniList.as_view(), name='alumni-lista'), 
url(r'^lista/(?P<page>\d+)$', views.AlumniRedirectMostrar.as_view(), name='alumni-redirect-mostrar'), 
url(r'^mostrar/(?P<pk>\d+)$', views.AlumniRetrieve.as_view(), name='alumni-mostrar'), 
url(r'^mostrar/padres/(?P<pk>\d+)$', views.AlumniRetrievePadres.as_view(), name='alumni-mostrar-padres'), 
url(r'^mostrar/autorizado/(?P<pk>\d+)$', views.AlumniRetrieveAutorizado.as_view(), name='alumni-mostrar-autorizado'), 
url(r'^mostrar/finanzas/(?P<pk>\d+)$', views.AlumniRetrieveFinanzas.as_view(), name='alumni-mostrar-finanzas'), 
url(r'^mostrar/documentos/(?P<pk>\d+)$', views.AlumniRetrieveDocumentos.as_view(), name='alumni-mostrar-documentos'), 
url(r'^inscripcion/$', views.AlumniRegister.as_view(), name='alumni-inscripcion'), 
url(r'^inscripcion/padres/(?P<pk>\d+)$', views.AlumniRegisterPadres.as_view(), name='alumni-inscripcion-padres'), 
url(r'^inscripcion/autorizado/(?P<pk>\d+)$', views.AlumniRegisterAutorizado.as_view(),  name='alumni-inscripcion-autorizado'), 
url(r'^inscripcion/finanzas/(?P<pk>\d+)$', views.AlumniRegisterFinanzas.as_view(),  name='alumni-inscripcion-finanzas'), 
url(r'^inscripcion/documentos/(?P<pk>\d+)$', views.AlumniRegisterDocumentos.as_view(),  name='alumni-inscripcion-documentos'), 
url(r'^preinscripcion/$', views.AlumniPreinscripcion.as_view(), name='alumni-preinscripcion'), 
url(r'^preinscripcion/padres/(?P<pk>\d+)$', views.AlumniPreinscripcionPadres.as_view(),  name='alumni-preinscripcion-padres'), 
url(r'^preinscripcion/autorizados/(?P<pk>\d+)$', views.AlumniPreinscripcionAutorizados.as_view(), name='alumni-preinscripcion-autorizados'), 
url(r'^preinscripcion/finanzas/(?P<pk>\d+)$', views.AlumniPreinscripcionFinanzas.as_view(), name='alumni-preinscripcion-finanzas'), 

views.py

class AlumniPreinscripcion(LoginRequiredMixin, CreateView): 
    model    = models.Alumni 
    form_class   = forms.AlumniFormPreinscripcion 
    context_object_name = 'alumno' 
    template_name  = 'alumni_preinscripcion.html' 
    def get_initial(self): 
     initial = super(AlumniPreinscripcion, self).get_initial() 
     initial['cycle'] = models.ScholarCycle.objects.get(cycle__exact='2014-2015') 
     return initial 
    def get_success_url(self, **kwargs): 
     return reverse('alumni-preinscripcion-padres', kwargs={'pk':self.object.id}) 

class AlumniPreinscripcionPadres(LoginRequiredMixin, UpdateView): 
    model    = models.Alumni 
    form_clas   = forms.AlumniFormPreinscripcionPadres 
    context_object_name = 'alumno' 
    template_name  = 'alumni_preinscripcion_padres.html' 
    def get_sucess_url(self, **kwargs): 
     return reverse('alumni-preinscripcion-autorizados', kwargs='pk':self.object.id}) 

alumni_preinscripcion_padres.html

{% extends "preinscripcion.html" %} 
{% load i18n %} 
{% load l10n %} 

{% block content %} 
    <h2>Padres</h2> 
    <form action="" method="post" enctype="multipart/form-data" accept-charset="utf-8"> 
    {% csrf_token %} 

    <fieldset> 
     <legend><strong>&nbsp;Pap&aacute;&nbsp;</strong></legend> 
     <div class="row-fluid"> 
     <div class="span2"> 
      <p>Nombre:</p> 
     </div> 
     <div class="span10"> 
      <p>{{ form.father_name }} {{ form.father_familynames }}</p> 
     </div> 
     </div> 

    <br /> 
    <p><input type="submit" value="Persona(s) Autorizada(s) &rarr;" /></p> 
    </form> 
{% endblock %} 

回答

0

您的校友模型中的cycle字段被定义为null=False, blank=True。你可能想改变它。我无法告诉你正确的值,因为这取决于你的应用程序逻辑,但这些值与你的表单视图不一致。从documention

null是纯数据库相关的,而空白是与验证相关的。 如果一个字段的值为空= True,则表单验证将允许输入一个空值的 。如果一个字段有空白= False,则该字段将是必需的。

阅读整个部分。一旦你了解了Model字段的正确设置,表单和基于类的视图就很可能工作得很好。 (仅供参考,您的CreateView的工作的原因是因为你专门设置initial['cycle']满足空条件,而你不这样做,在更新视图和更新表单认为它是好有空/空值)。

更新:您的AlumniPreinscripcionPadres视图中有两个拼写错误,get_sucess_url()form_clas,都缺少一个字母。

+0

谢谢JCotton !!! :)我歪歪校友和ScholarCycle,看到你指出。我匹配了两个,所以null = True和blank = True。现在我没有收到错误信息,但我无法保存并返回到同一更新页面。日志不会显示任何类型的错误。 – Francisco

+0

@francisco你有没有看到我更新的答案?你解决了这个问题吗? – JCotton

+0

谢谢JCotton,解决拼写错误使一切工作! – Francisco