2010-03-29 18 views
9

que tiene una forma y un juego de formularios en mi plantilla. El problema es que el formset arroja un error de validación al reclamar que el formulario de administración "falta o ha sido alterado".Django formset forma de gestión de errores de validación

Aquí es mi punto de vista

@login_required 
def home(request): 

    user = UserProfile.objects.get(pk=request.session['_auth_user_id']) 
    blogz = list(blog.objects.filter(deleted='0')) 
    delblog = modelformset_factory(blog, exclude=('poster','date' ,'title','content')) 
    if request.user.is_staff== True: 
     staff = 1 
    else: 
     staff = 0 
    staffis = 1 

    if request.method == 'POST': 
     delblogformset = delblog(request.POST) 
     if delblogformset.is_valid(): 
     delblogformset.save() 
      return HttpResponseRedirect('/home') 

    else: 
     delblogformset = delblog(queryset=blog.objects.filter(deleted='0')) 


     blogform = BlogForm(request.POST) 
     if blogform.is_valid(): 
      blogform.save() 
     return HttpResponseRedirect('/home') 

    else: 
     blogform = BlogForm(initial = {'poster':user.id}) 
    blogs= zip(blogz,delblogformset.forms) 

    paginator = Paginator(blogs, 10) # Show 25 contacts per page 

    # Make sure page request is an int. If not, deliver first page. 
    try: 
     page = int(request.GET.get('page', '1')) 
    except ValueError: 
     page = 1 

    # If page request (9999) is out of range, deliver last page of results. 
    try: 
     blogs = paginator.page(page) 
    except (EmptyPage, InvalidPage): 
     blogs = paginator.page(paginator.num_pages) 

    return render_to_response('home.html', {'user':user, 'blogform':blogform, 'staff': staff, 'staffis': staffis, 'blog':blogs, 'delblog':delblogformset}, context_instance = RequestContext(request)) 

mi plantilla

{%block content%} 


<h2>Home</h2> 

{% ifequal staff staffis %} 
{% if form.errors %} 
    <ul> 
     {% for field in form %} 
      <H3 class="title"> 
      <p class="error"> {% if field.errors %}<li>{{ field.errors|striptags }}</li>{% endif %}</p> 
      </H3> 
     {% endfor %} 
    </ul> 
    {% endif %} 


    <h3>Post a Blog to the Front Page</h3> 
<form method="post" id="form2" action="" class="infotabs accfrm"> 
    {{ blogform.as_p }} 
    <input type="submit" value="Submit" /> 
</form> 
<br> 
<br> 
{% endifequal %} 


<div class="pagination"> 
    <span class="step-links"> 
     {% if blog.has_previous %} 
      <a href="?page={{ blog.previous_page_number }}">previous</a> 
     {% endif %} 

     <span class="current"> 
      Page {{ blog.number }} of {{ blog.paginator.num_pages }}. 
     </span> 

     {% if blog.has_next %} 
      <a href="?page={{ blog.next_page_number }}">next</a> 
     {% endif %} 
    </span> 


<form method="post" action="" class="usertabs accfrm"> 
{{delblog.management_form}} 
{% for b, form in blog.object_list %} 
<div class="blog"> 
<h3>{{b.title}}</h3> 
<p>{{b.content}}</p> 
<p>posted by <strong>{{b.poster}}</strong> on {{b.date}}</p> 
{% ifequal staff staffis %}<p>{{form.as_p}}<input type="submit" value="Delete" /></p>{% endifequal %} 
</div> 
{% endfor %} 
</form> 




{%endblock%} 

Aquí está el Rastreo

ValidationError at /home/ 

Request Method:  POST 
Request URL: http://localhost:8000/home/ 
Exception Type:  ValidationError 
Exception Value:  

Exception Location:  /usr/lib/python2.6/site-packages/django/forms/formsets.py in _management_form, line 54 
Python Executable: /usr/bin/python 
Python Version:  2.6.2 
Python Path: ['/home/projects/acms', '/usr/lib/python2.6/site-packages/django_socialregistration-0.2-py2.6.egg', '/usr/lib/python26.zip', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/site-packages', '/usr/lib/python2.6/site-packages/Numeric', '/usr/lib/python2.6/site-packages/PIL', '/usr/lib/python2.6/site-packages/gst-0.10', '/usr/lib/python2.6/site-packages/gtk-2.0', '/usr/lib/python2.6/site-packages/webkit-1.0'] 
Server time: Mon, 29 Mar 2010 12:02:43 +0300 
Traceback Switch to copy-and-paste view 

* /usr/lib/python2.6/site-packages/django/core/handlers/base.py in get_response 
    85. # Apply view middleware 
    86. for middleware_method in self._view_middleware: 
    87. response = middleware_method(request, callback, callback_args, callback_kwargs) 
    88. if response: 
    89. return response 
    90. 
    91. try: 
    92. response = callback(request, *callback_args, **callback_kwargs) ... 
    93. except Exception, e: 
    94. # If the view raised an exception, run it through exception 
    95. # middleware, and if the exception middleware returns a 
    96. # response, use that. Otherwise, reraise the exception. 
    97. for middleware_method in self._exception_middleware: 
    98. response = middleware_method(request, e) 
    ▶ Local vars 
    Variable Value 
    callback 
    <django.contrib.auth.decorators._CheckLogin object at 0xb655ad2c> 
    callback_args  
() 
    callback_kwargs 
    {} 
    e  
    ValidationError() 
    exc_info 
    (<class 'django.forms.util.ValidationError'>, ValidationError(), <traceback object at 0xb6630a2c>) 
    exceptions  
    <module 'django.core.exceptions' from '/usr/lib/python2.6/site-packages/django/core/exceptions.pyc'> 
    middleware_method  
    <bound method TransactionMiddleware.process_exception of <django.middleware.transaction.TransactionMiddleware object at 0xb676ff6c>> 
    receivers  
    [(<function _rollback_on_exception at 0x8c845dc>, None)] 
    request 
    <WSGIRequest GET:<QueryDict: {}>, POST:<QueryDict: {u'content': [u'test'], u'poster': [u'4'], u'title': [u'test']}>, COOKIES:{'sessionid': '8f4b4fa8411cc5baa05c2016a8ad00f4'}, META:{'COLORTERM': 'gnome-terminal', 'CONTENT_LENGTH': '32', 'CONTENT_TYPE': 'application/x-www-form-urlencoded', 'CVS_RSH': 'ssh', 'DBUS_SESSION_BUS_ADDRESS': 'unix:abstract=/tmp/dbus-nKl1u8UWGs,guid=fabac1ba0d651ceae76e1d9a4bafa535', 'DESKTOP_SESSION': 'gnome', 'DISPLAY': ':0.0', 'DJANGO_SETTINGS_MODULE': 'acms.settings', 'GATEWAY_INTERFACE': 'CGI/1.1', 'GDMSESSION': 'gnome', 'GDM_KEYBOARD_LAYOUT': 'us', 'GDM_LANG': 'en_GB.UTF-8', 'GNOME_DESKTOP_SESSION_ID': 'this-is-deprecated', 'GNOME_KEYRING_PID': '1511', 'GNOME_KEYRING_SOCKET': '/tmp/keyring-uvdktc/socket', 'GTK_RC_FILES': '/etc/gtk/gtkrc:/home/user/.gtkrc-1.2-gnome2', 'G_BROKEN_FILENAMES': '1', 'HISTCONTROL': 'ignoreboth', 'HISTSIZE': '1000', 'HOME': '/home/user', 'HOSTNAME': 'desktop.theblackout', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'HTTP_ACCEPT_ENCODING': 'gzip,deflate', 'HTTP_ACCEPT_LANGUAGE': 'en-us,en;q=0.5', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_COOKIE': 'sessionid=8f4b4fa8411cc5baa05c2016a8ad00f4', 'HTTP_HOST': 'localhost:8000', 'HTTP_KEEP_ALIVE': '115', 'HTTP_REFERER': 'http://localhost:8000/home/', 'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100218 Fedora/3.6.1-1.fc13 Firefox/3.6', 'IMSETTINGS_INTEGRATE_DESKTOP': 'yes', 'IMSETTINGS_MODULE': 'none', 'KDEDIRS': '/usr', 'KDE_IS_PRELINKED': '1', 'KMIX_PULSEAUDIO_DISABLE': '1', 'LANG': 'en_GB.UTF-8', 'LESSOPEN': '|/usr/bin/lesspipe.sh %s', 'LOGNAME': 'user', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:', 'MAIL': '/var/spool/mail/user', 'OLDPWD': '/home/user', 'ORBIT_SOCKETDIR': '/tmp/orbit-user', 'PATH': '/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/real/RealPlayer:/home/user/bin:/opt/real/RealPlayer', 'PATH_INFO': u'/home/', 'PWD': '/home/projects/acms', 'QTDIR': '/usr/lib/qt-3.3', 'QTINC': '/usr/lib/qt-3.3/include', 'QTLIB': '/usr/lib/qt-3.3/lib', 'QT_IM_MODULE': 'xim', 'QUERY_STRING': '', 'REMOTE_ADDR': '127.0.0.1', 'REMOTE_HOST': '', 'REQUEST_METHOD': 'POST', 'RUN_MAIN': 'true', 'SCRIPT_NAME': u'', 'SERVER_NAME': 'localhost.localdomain', 'SERVER_PORT': '8000', 'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'WSGIServer/0.1 Python/2.6.2', 'SESSION_MANAGER': 'local/unix:@/tmp/.ICE-unix/1518,unix/unix:/tmp/.ICE-unix/1518', 'SHELL': '/bin/bash', 'SHLVL': '2', 'SSH_ASKPASS': '/usr/libexec/openssh/gnome-ssh-askpass', 'SSH_AUTH_SOCK': '/tmp/keyring-uvdktc/socket.ssh', 'TERM': 'xterm', 'TZ': 'Africa/Nairobi', 'USER': 'user', 'USERNAME': 'user', 'WINDOWID': '79691779', 'XAUTHORITY': '/var/run/gdm/auth-for-user-YHprr5/database', 'XDG_SESSION_COOKIE': 'b52f8ef12c1cf7be85729e5e4ae08729-1269802292.411279-1821712829', 'XMODIFIERS': '@im=none', '_': '/usr/bin/python', 'wsgi.errors': <open file '<stderr>', mode 'w' at 0xb76b70c0>, 'wsgi.file_wrapper': <class 'django.core.servers.basehttp.FileWrapper'>, 'wsgi.input': <socket._fileobject object at 0xb675f8b4>, 'wsgi.multiprocess': False, 'wsgi.multithread': True, 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.version': (1, 0)}> 
    resolver 
    <RegexURLResolver acms.urls (None:None) ^/> 
    response 
    None 
    self 
    <django.core.handlers.wsgi.WSGIHandler object at 0xb6755acc> 
    settings 
    <django.conf.LazySettings object at 0xb740856c> 
    urlconf 
    'acms.urls' 
    urlresolvers 
    <module 'django.core.urlresolvers' from '/usr/lib/python2.6/site-packages/django/core/urlresolvers.pyc'> 
* /usr/lib/python2.6/site-packages/django/contrib/auth/decorators.py in __call__ 
    71. 
    72. def __get__(self, obj, cls=None): 
    73. view_func = self.view_func.__get__(obj, cls) 
    74. return _CheckLogin(view_func, self.test_func, self.login_url, self.redirect_field_name) 
    75. 
    76. def __call__(self, request, *args, **kwargs): 
    77. if self.test_func(request.user): 
    78. return self.view_func(request, *args, **kwargs) ... 
    79. path = urlquote(request.get_full_path()) 
    80. tup = self.login_url, self.redirect_field_name, path 
    81. return HttpResponseRedirect('%s?%s=%s' % tup) 
    ▶ Local vars 
    Variable Value 
    args 
() 
    kwargs  
    {} 
    request 
    <WSGIRequest GET:<QueryDict: {}>, POST:<QueryDict: {u'content': [u'test'], u'poster': [u'4'], u'title': [u'test']}>, COOKIES:{'sessionid': '8f4b4fa8411cc5baa05c2016a8ad00f4'}, META:{'COLORTERM': 'gnome-terminal', 'CONTENT_LENGTH': '32', 'CONTENT_TYPE': 'application/x-www-form-urlencoded', 'CVS_RSH': 'ssh', 'DBUS_SESSION_BUS_ADDRESS': 'unix:abstract=/tmp/dbus-nKl1u8UWGs,guid=fabac1ba0d651ceae76e1d9a4bafa535', 'DESKTOP_SESSION': 'gnome', 'DISPLAY': ':0.0', 'DJANGO_SETTINGS_MODULE': 'acms.settings', 'GATEWAY_INTERFACE': 'CGI/1.1', 'GDMSESSION': 'gnome', 'GDM_KEYBOARD_LAYOUT': 'us', 'GDM_LANG': 'en_GB.UTF-8', 'GNOME_DESKTOP_SESSION_ID': 'this-is-deprecated', 'GNOME_KEYRING_PID': '1511', 'GNOME_KEYRING_SOCKET': '/tmp/keyring-uvdktc/socket', 'GTK_RC_FILES': '/etc/gtk/gtkrc:/home/user/.gtkrc-1.2-gnome2', 'G_BROKEN_FILENAMES': '1', 'HISTCONTROL': 'ignoreboth', 'HISTSIZE': '1000', 'HOME': '/home/user', 'HOSTNAME': 'desktop.theblackout', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'HTTP_ACCEPT_ENCODING': 'gzip,deflate', 'HTTP_ACCEPT_LANGUAGE': 'en-us,en;q=0.5', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_COOKIE': 'sessionid=8f4b4fa8411cc5baa05c2016a8ad00f4', 'HTTP_HOST': 'localhost:8000', 'HTTP_KEEP_ALIVE': '115', 'HTTP_REFERER': 'http://localhost:8000/home/', 'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100218 Fedora/3.6.1-1.fc13 Firefox/3.6', 'IMSETTINGS_INTEGRATE_DESKTOP': 'yes', 'IMSETTINGS_MODULE': 'none', 'KDEDIRS': '/usr', 'KDE_IS_PRELINKED': '1', 'KMIX_PULSEAUDIO_DISABLE': '1', 'LANG': 'en_GB.UTF-8', 'LESSOPEN': '|/usr/bin/lesspipe.sh %s', 'LOGNAME': 'user', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:', 'MAIL': '/var/spool/mail/user', 'OLDPWD': '/home/user', 'ORBIT_SOCKETDIR': '/tmp/orbit-user', 'PATH': '/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/real/RealPlayer:/home/user/bin:/opt/real/RealPlayer', 'PATH_INFO': u'/home/', 'PWD': '/home/projects/acms', 'QTDIR': '/usr/lib/qt-3.3', 'QTINC': '/usr/lib/qt-3.3/include', 'QTLIB': '/usr/lib/qt-3.3/lib', 'QT_IM_MODULE': 'xim', 'QUERY_STRING': '', 'REMOTE_ADDR': '127.0.0.1', 'REMOTE_HOST': '', 'REQUEST_METHOD': 'POST', 'RUN_MAIN': 'true', 'SCRIPT_NAME': u'', 'SERVER_NAME': 'localhost.localdomain', 'SERVER_PORT': '8000', 'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'WSGIServer/0.1 Python/2.6.2', 'SESSION_MANAGER': 'local/unix:@/tmp/.ICE-unix/1518,unix/unix:/tmp/.ICE-unix/1518', 'SHELL': '/bin/bash', 'SHLVL': '2', 'SSH_ASKPASS': '/usr/libexec/openssh/gnome-ssh-askpass', 'SSH_AUTH_SOCK': '/tmp/keyring-uvdktc/socket.ssh', 'TERM': 'xterm', 'TZ': 'Africa/Nairobi', 'USER': 'user', 'USERNAME': 'user', 'WINDOWID': '79691779', 'XAUTHORITY': '/var/run/gdm/auth-for-user-YHprr5/database', 'XDG_SESSION_COOKIE': 'b52f8ef12c1cf7be85729e5e4ae08729-1269802292.411279-1821712829', 'XMODIFIERS': '@im=none', '_': '/usr/bin/python', 'wsgi.errors': <open file '<stderr>', mode 'w' at 0xb76b70c0>, 'wsgi.file_wrapper': <class 'django.core.servers.basehttp.FileWrapper'>, 'wsgi.input': <socket._fileobject object at 0xb675f8b4>, 'wsgi.multiprocess': False, 'wsgi.multithread': True, 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.version': (1, 0)}> 
    self 
    <django.contrib.auth.decorators._CheckLogin object at 0xb655ad2c> 
* /home/projects/acms/../acms/cms/views.py in home 
    45. if request.user.is_staff== True: 
    46. staff = 1 
    47. else: 
    48. staff = 0 
    49. staffis = 1 
    50. 
    51. if request.method == 'POST': 
    52. delblogformset = delblog(request.POST) ... 
    53. if delblogformset.is_valid(): 
    54. delblogformset.save() 
    55. return HttpResponseRedirect('/home') 
    56. 
    57. else: 
    58. delblogformset = delblog(queryset=blog.objects.filter(deleted='0')) 
    ▶ Local vars 
    Variable Value 
    blogz  
    Error in formatting: %d format: a number is required, not unicode 
    delblog 
    <class 'django.forms.formsets.blogFormFormSet'> 
    request 
    <WSGIRequest GET:<QueryDict: {}>, POST:<QueryDict: {u'content': [u'test'], u'poster': [u'4'], u'title': [u'test']}>, COOKIES:{'sessionid': '8f4b4fa8411cc5baa05c2016a8ad00f4'}, META:{'COLORTERM': 'gnome-terminal', 'CONTENT_LENGTH': '32', 'CONTENT_TYPE': 'application/x-www-form-urlencoded', 'CVS_RSH': 'ssh', 'DBUS_SESSION_BUS_ADDRESS': 'unix:abstract=/tmp/dbus-nKl1u8UWGs,guid=fabac1ba0d651ceae76e1d9a4bafa535', 'DESKTOP_SESSION': 'gnome', 'DISPLAY': ':0.0', 'DJANGO_SETTINGS_MODULE': 'acms.settings', 'GATEWAY_INTERFACE': 'CGI/1.1', 'GDMSESSION': 'gnome', 'GDM_KEYBOARD_LAYOUT': 'us', 'GDM_LANG': 'en_GB.UTF-8', 'GNOME_DESKTOP_SESSION_ID': 'this-is-deprecated', 'GNOME_KEYRING_PID': '1511', 'GNOME_KEYRING_SOCKET': '/tmp/keyring-uvdktc/socket', 'GTK_RC_FILES': '/etc/gtk/gtkrc:/home/user/.gtkrc-1.2-gnome2', 'G_BROKEN_FILENAMES': '1', 'HISTCONTROL': 'ignoreboth', 'HISTSIZE': '1000', 'HOME': '/home/user', 'HOSTNAME': 'desktop.theblackout', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'HTTP_ACCEPT_ENCODING': 'gzip,deflate', 'HTTP_ACCEPT_LANGUAGE': 'en-us,en;q=0.5', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_COOKIE': 'sessionid=8f4b4fa8411cc5baa05c2016a8ad00f4', 'HTTP_HOST': 'localhost:8000', 'HTTP_KEEP_ALIVE': '115', 'HTTP_REFERER': 'http://localhost:8000/home/', 'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100218 Fedora/3.6.1-1.fc13 Firefox/3.6', 'IMSETTINGS_INTEGRATE_DESKTOP': 'yes', 'IMSETTINGS_MODULE': 'none', 'KDEDIRS': '/usr', 'KDE_IS_PRELINKED': '1', 'KMIX_PULSEAUDIO_DISABLE': '1', 'LANG': 'en_GB.UTF-8', 'LESSOPEN': '|/usr/bin/lesspipe.sh %s', 'LOGNAME': 'user', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:', 'MAIL': '/var/spool/mail/user', 'OLDPWD': '/home/user', 'ORBIT_SOCKETDIR': '/tmp/orbit-user', 'PATH': '/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/real/RealPlayer:/home/user/bin:/opt/real/RealPlayer', 'PATH_INFO': u'/home/', 'PWD': '/home/projects/acms', 'QTDIR': '/usr/lib/qt-3.3', 'QTINC': '/usr/lib/qt-3.3/include', 'QTLIB': '/usr/lib/qt-3.3/lib', 'QT_IM_MODULE': 'xim', 'QUERY_STRING': '', 'REMOTE_ADDR': '127.0.0.1', 'REMOTE_HOST': '', 'REQUEST_METHOD': 'POST', 'RUN_MAIN': 'true', 'SCRIPT_NAME': u'', 'SERVER_NAME': 'localhost.localdomain', 'SERVER_PORT': '8000', 'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'WSGIServer/0.1 Python/2.6.2', 'SESSION_MANAGER': 'local/unix:@/tmp/.ICE-unix/1518,unix/unix:/tmp/.ICE-unix/1518', 'SHELL': '/bin/bash', 'SHLVL': '2', 'SSH_ASKPASS': '/usr/libexec/openssh/gnome-ssh-askpass', 'SSH_AUTH_SOCK': '/tmp/keyring-uvdktc/socket.ssh', 'TERM': 'xterm', 'TZ': 'Africa/Nairobi', 'USER': 'user', 'USERNAME': 'user', 'WINDOWID': '79691779', 'XAUTHORITY': '/var/run/gdm/auth-for-user-YHprr5/database', 'XDG_SESSION_COOKIE': 'b52f8ef12c1cf7be85729e5e4ae08729-1269802292.411279-1821712829', 'XMODIFIERS': '@im=none', '_': '/usr/bin/python', 'wsgi.errors': <open file '<stderr>', mode 'w' at 0xb76b70c0>, 'wsgi.file_wrapper': <class 'django.core.servers.basehttp.FileWrapper'>, 'wsgi.input': <socket._fileobject object at 0xb675f8b4>, 'wsgi.multiprocess': False, 'wsgi.multithread': True, 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.version': (1, 0)}> 
    staff  
    1 
    staffis 
    1 
    user 
    <UserProfile: Treasurer> 
* /usr/lib/python2.6/site-packages/django/forms/models.py in __init__ 
    452. model = None 
    453. 
    454. def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, 
    455. queryset=None, **kwargs): 
    456. self.queryset = queryset 
    457. defaults = {'data': data, 'files': files, 'auto_id': auto_id, 'prefix': prefix} 
    458. defaults.update(kwargs) 
    459. super(BaseModelFormSet, self).__init__(**defaults) ... 
    460. 
    461. def initial_form_count(self): 
    462. """Returns the number of forms that are required in this FormSet.""" 
    463. if not (self.data or self.files): 
    464. return len(self.get_queryset()) 
    465. return super(BaseModelFormSet, self).initial_form_count() 
    ▶ Local vars 
    Variable Value 
    auto_id 
    'id_%s' 
    data 
    <QueryDict: {u'content': [u'test'], u'poster': [u'4'], u'title': [u'test']}> 
    defaults 
    {'auto_id': 'id_%s', 'data': <QueryDict: {u'content': [u'test'], u'poster': [u'4'], u'title': [u'test']}>, 'files': None, 'prefix': None} 
    files  
    None 
    kwargs  
    {} 
    prefix  
    None 
    queryset 
    None 
    self 
    <django.forms.formsets.blogFormFormSet object at 0xb659bdec> 
* /usr/lib/python2.6/site-packages/django/forms/formsets.py in __init__ 
    37. self.data = data 
    38. self.files = files 
    39. self.initial = initial 
    40. self.error_class = error_class 
    41. self._errors = None 
    42. self._non_form_errors = None 
    43. # construct the forms in the formset 
    44. self._construct_forms() ... 
    45. 
    46. def __unicode__(self): 
    47. return self.as_table() 
    48. 
    49. def _management_form(self): 
    50. """Returns the ManagementForm instance for this FormSet.""" 
    ▶ Local vars 
    Variable Value 
    auto_id 
    'id_%s' 
    data 
    <QueryDict: {u'content': [u'test'], u'poster': [u'4'], u'title': [u'test']}> 
    error_class 
    <class 'django.forms.util.ErrorList'> 
    files  
    None 
    initial 
    None 
    prefix  
    None 
    self 
    <django.forms.formsets.blogFormFormSet object at 0xb659bdec> 
* /usr/lib/python2.6/site-packages/django/forms/formsets.py in _construct_forms 
    80. if initial_forms > self.max_num > 0: 
    81. initial_forms = self.max_num 
    82. return initial_forms 
    83. 
    84. def _construct_forms(self): 
    85. # instantiate all the forms and put them in self.forms 
    86. self.forms = [] 
    87. for i in xrange(self.total_form_count()): ... 
    88. self.forms.append(self._construct_form(i)) 
    89. 
    90. def _construct_form(self, i, **kwargs): 
    91. """ 
    92. Instantiates and returns the i-th form instance in a formset. 
    93. """ 
    ▶ Local vars 
    Variable Value 
    self 
    <django.forms.formsets.blogFormFormSet object at 0xb659bdec> 
* /usr/lib/python2.6/site-packages/django/forms/formsets.py in total_form_count 
    59. }) 
    60. return form 
    61. management_form = property(_management_form) 
    62. 
    63. def total_form_count(self): 
    64. """Returns the total number of forms in this FormSet.""" 
    65. if self.data or self.files: 
    66. return self.management_form.cleaned_data[TOTAL_FORM_COUNT] ... 
    67. else: 
    68. total_forms = self.initial_form_count() + self.extra 
    69. if total_forms > self.max_num > 0: 
    70. total_forms = self.max_num 
    71. return total_forms 
    72. 
     ▶ Local vars 
    Variable Value 
    self 
    <django.forms.formsets.blogFormFormSet object at 0xb659bdec> 
* /usr/lib/python2.6/site-packages/django/forms/formsets.py in _management_form 
    47. return self.as_table() 
    48. 
    49. def _management_form(self): 
    50. """Returns the ManagementForm instance for this FormSet.""" 
    51. if self.data or self.files: 
    52. form = ManagementForm(self.data, auto_id=self.auto_id, prefix=self.prefix) 
    53. if not form.is_valid(): 
    54. raise ValidationError('ManagementForm data is missing or has been tampered with') ... 
    55. else: 
    56. form = ManagementForm(auto_id=self.auto_id, prefix=self.prefix, initial={ 
    57. TOTAL_FORM_COUNT: self.total_form_count(), 
    58. INITIAL_FORM_COUNT: self.initial_form_count() 
    59. }) 
    60. return form 
    ▶ Local vars 
+0

para empezar se podría añadir goma de la copia de un mensaje de error real, URL y rutas de los archivos – Unreason

+0

la sangría en la línea 16 del ejemplo de la vista no se ve bien. – akaihola

Respuesta

7

Para evitar este error, simplemente ajuste su formset POST que limita en un bloque try/except como tal.

from django.core.exceptions import ValidationError # add this to your imports 

if request.method == 'POST': 
    try: 
     delblogformset = delblog(request.POST) 
    except ValidationError: 
     delblogformset = None 
    if delblogformset and delblogformset.is_valid(): 
     delblogformset.save() 
      return HttpResponseRedirect('/home') 

La solicitud POST desde su blogform carece de la entrada oculta 'ManagementForm' que se requiere para su delblogformset y por lo tanto se lanza el error de validación. Nos envolvemos en un bloque try/except porque sabemos que si ValidationError se ha planteado que el puesto ha sido destinado para su blogform y no delblogformset.

Para más información ver documentación de Django: http://docs.djangoproject.com/en/dev/topics/forms/formsets/#understanding-the-managementform

+0

Esta respuesta ha sido muy útil. En mi caso, sin embargo, el problema parecía ser que no procesé los datos de ManagementForm en la plantilla (incluyendo algo como '{{my_formset.management_form}}'). – Asotos

1

he dado cuenta de esto después de correr en el mismo error. En situaciones donde está utilizando un formulario y un formset en la misma vista y plantilla, el formulario debe procesarse antes del formset para evitar generar un error de validación de formset.

de importancia también, if request.method == 'POST': sólo debe utilizarse en el juego de formularios. Entonces, lo anterior aparecerá de la siguiente manera en la vista:

@login_required 
def home(request): 

    user = UserProfile.objects.get(pk=request.session['_auth_user_id']) 
    blogz = list(blog.objects.filter(deleted='0')) 
    delblog = modelformset_factory(blog, exclude=('poster','date' ,'title','content')) 
    if request.user.is_staff== True: 
     staff = 1 
    else: 
     staff = 0 
    staffis = 1 

    blogform = BlogForm(request.POST) 
    if blogform.is_valid(): 
     blogform.save() 
     return HttpResponseRedirect('/home') 

    else: 
    blogform = BlogForm(initial = {'poster':user.id}) 

    if request.method == 'POST': 
    delblogformset = delblog(request.POST) 
    if delblogformset.is_valid(): 
     delblogformset.save() 
     return HttpResponseRedirect('/home') 

    else: 
     delblogformset = delblog(queryset=blog.objects.filter(deleted='0')) 



    blogs= zip(blogz,delblogformset.forms) 

    paginator = Paginator(blogs, 10) # Show 25 contacts per page 

    # Make sure page request is an int. If not, deliver first page. 
    try: 
     page = int(request.GET.get('page', '1')) 
    except ValueError: 
     page = 1 

    # If page request (9999) is out of range, deliver last page of results. 
    try: 
     blogs = paginator.page(page) 
    except (EmptyPage, InvalidPage): 
     blogs = paginator.page(paginator.num_pages) 

    return render_to_response('home.html', {'user':user, 'blogform':blogform, 'staff': staff, 'staffis': staffis, 'blog':blogs, 'delblog':delblogformset}, context_instance = RequestContext(request)) 
+0

Si leo la sangría mezclado correctamente, los cambios en el juego de formularios 'delblogformset' solamente se salvan cuando el' forma blogform' no es válido. Si es válido en su lugar, se redirige al usuario y se pierden todos los cambios en el formset. Además, ¿podría explicar por qué * * es importante para manejar el formulario antes de que el juego de formularios? es éste el mismo problema que se describe en http://groups.google.com/group/django-users/browse_thread/thread/84bf7fc046e4e65d? – akaihola

+0

Creo que resolví la sangría ahora, y sí, es el mismo error. –

Cuestiones relacionadas