[Django] #21955: Formset save_as_new=True causes "This QueryDict instance is immutable" error

41 views
Skip to first unread message

Django

unread,
Feb 5, 2014, 3:26:10 AM2/5/14
to django-...@googlegroups.com
#21955: Formset save_as_new=True causes "This QueryDict instance is immutable"
error
----------------------------+--------------------
Reporter: robin | Owner: nobody
Type: Bug | Status: new
Component: Forms | Version: 1.6
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
----------------------------+--------------------
Basically if you post a properly setup inline formset with
'''save_as_new=True''' argument:
{{{
FormSet = inlineformset_factory(Model, SubModel)
formset = FormSet(request.POST, save_as_new=True)
}}}
You will get
{{{
AttributeError at /
This QueryDict instance is immutable
}}}

'''Some demo code below:'''

views.py
{{{#!python
from django.forms.models import inlineformset_factory
from django.middleware.csrf import get_token
from django.http import HttpResponse
from django.template.base import Template, Context

from app.models import App, SubApp

def home(request):
FormSet = inlineformset_factory(App, SubApp)
if request.method == 'POST':
formset = FormSet(request.POST, save_as_new=True)
else:
formset = FormSet()

csrf = get_token(request)

t = '''
<form method="POST">
{{ formset }}
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf
}}" />
<input type="submit" />
</form>
'''
c = {
'formset': formset,
'csrf': csrf,
}
s = Template(t).render(Context(c))
return HttpResponse(s)
}}}

models.py
{{{#!python
from django.db import models

class App(models.Model):
pass

class SubApp(models.Model):
app = models.ForeignKey(App)
}}}

--
Ticket URL: <https://code.djangoproject.com/ticket/21955>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Feb 8, 2014, 3:15:30 PM2/8/14
to django-...@googlegroups.com
#21955: Formset save_as_new=True causes "This QueryDict instance is immutable"
error
------------------------+--------------------------------------

Reporter: robin | Owner: nobody
Type: Bug | Status: new
Component: Forms | Version: 1.6
Severity: Normal | Resolution:
Keywords: | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
------------------------+--------------------------------------
Changes (by aaugustin):

* needs_better_patch: => 0
* needs_tests: => 0
* needs_docs: => 0


Comment:

Could you provide the full traceback please?

--
Ticket URL: <https://code.djangoproject.com/ticket/21955#comment:1>

Django

unread,
Feb 9, 2014, 6:53:47 AM2/9/14
to django-...@googlegroups.com
#21955: Formset save_as_new=True causes "This QueryDict instance is immutable"
error
------------------------+--------------------------------------

Reporter: robin | Owner: nobody
Type: Bug | Status: new
Component: Forms | Version: 1.6
Severity: Normal | Resolution:
Keywords: | Triage Stage: Unreviewed

Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
------------------------+--------------------------------------

Comment (by robin):

Sure.

{{{
Environment:


Request Method: POST
Request URL: http://localhost:8001/

Django Version: 1.6
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware')


Template error:
In template <unknown source>, error at line 3


This QueryDict instance is immutable

1 :


2 : <form method="POST">


3 : {{ formset }}


4 : <input type="hidden" name="csrfmiddlewaretoken"
value="{{ csrf }}" />


5 : <input type="submit" />


6 : </form>


7 :

Traceback:
File "/home/robin/work/d16/lib/python2.7/site-
packages/django/core/handlers/base.py" in get_response
114. response = wrapped_callback(request,
*callback_args, **callback_kwargs)
File "/home/robin/work/d16/toast/toast/views.py" in home
28. s = Template(t).render(Context(c))
File "/home/robin/work/d16/lib/python2.7/site-
packages/django/template/base.py" in render
140. return self._render(context)
File "/home/robin/work/d16/lib/python2.7/site-
packages/django/template/base.py" in _render
134. return self.nodelist.render(context)
File "/home/robin/work/d16/lib/python2.7/site-
packages/django/template/base.py" in render
840. bit = self.render_node(node, context)
File "/home/robin/work/d16/lib/python2.7/site-
packages/django/template/debug.py" in render_node
78. return node.render(context)
File "/home/robin/work/d16/lib/python2.7/site-
packages/django/template/debug.py" in render
91. output = force_text(output)
File "/home/robin/work/d16/lib/python2.7/site-
packages/django/utils/encoding.py" in force_text
100. s = s.__unicode__()
File "/home/robin/work/d16/lib/python2.7/site-
packages/django/forms/formsets.py" in __str__
61. return self.as_table()
File "/home/robin/work/d16/lib/python2.7/site-
packages/django/forms/formsets.py" in as_table
383. forms = ' '.join([form.as_table() for form in self])
File "/home/robin/work/d16/lib/python2.7/site-
packages/django/forms/formsets.py" in __iter__
65. return iter(self.forms)
File "/home/robin/work/d16/lib/python2.7/site-
packages/django/utils/functional.py" in __get__
49. res = instance.__dict__[self.func.__name__] =
self.func(instance)
File "/home/robin/work/d16/lib/python2.7/site-
packages/django/forms/formsets.py" in forms
133. forms = [self._construct_form(i) for i in
xrange(self.total_form_count())]
File "/home/robin/work/d16/lib/python2.7/site-
packages/django/forms/models.py" in _construct_form
843. form.data[form.add_prefix(self._pk_field.name)] = None
File "/home/robin/work/d16/lib/python2.7/site-
packages/django/http/request.py" in __setitem__
318. self._assert_mutable()
File "/home/robin/work/d16/lib/python2.7/site-
packages/django/http/request.py" in _assert_mutable
315. raise AttributeError("This QueryDict instance is
immutable")

Exception Type: AttributeError at /
Exception Value: This QueryDict instance is immutable
}}}

--
Ticket URL: <https://code.djangoproject.com/ticket/21955#comment:2>

Django

unread,
Mar 20, 2014, 5:52:08 PM3/20/14
to django-...@googlegroups.com
#21955: Formset save_as_new=True causes "This QueryDict instance is immutable"
error
------------------------+--------------------------------------
Reporter: robin | Owner: nobody
Type: Bug | Status: closed
Component: Forms | Version: 1.6
Severity: Normal | Resolution: invalid
Keywords: | Triage Stage: Unreviewed

Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
------------------------+--------------------------------------
Changes (by aaugustin):

* status: new => closed
* resolution: => invalid


Comment:

I'm not sure this is legal. Django's tests pass an `instance` and in that
case `save_as_new` appears to work. The docs also show an example with an
`instance` parameter.

Anyway, since `save_as_new` isn't documented, you're in private API
territory here. If you have a patch for this we may take a look, otherwise
we're just going to say that the public API works.

--
Ticket URL: <https://code.djangoproject.com/ticket/21955#comment:3>

Reply all
Reply to author
Forward
0 new messages