Hi all,
I am having a problem saving a Django form using the *FormWizard
<https://docs.djangoproject.com/en/1.7/ref/contrib/formtools/form-wizard/>*
while using *Django 1.7* and *Python 3.4*. Below is my code:
*models.py*
...class Advert(models.Model):
... # Some irelevant code removed for brevity
owner = models.ForeignKey(settings.AUTH_USER_MODEL, db_index=True,
blank=False, null=False)
title = models.CharField(_("Title"), max_length=120)
description = models.TextField(_("Description"), default='')
category = models.ForeignKey(AdCategory, db_index=True,
related_name='ad_category', verbose_name=_('Category'))
status = models.IntegerField(choices=ADVERT_STATES, default=0)
adtype = models.IntegerField(choices=ADTYPES, default=1)
price = models.DecimalField(_('Price'), max_digits=12,
decimal_places=2, blank=True, default=0,
help_text=_('Price'),
validators=[MinValueValidator(0)])
...class AdvertImage(models.Model):
def generate_new_filename(instance, filename):
IMAGE_UPLOAD_DIR = "advert_images"
old_fname, extension = os.path.splitext(filename)
return '%s/%s%s' % (IMAGE_UPLOAD_DIR, uuid.uuid4().hex, extension)
advert = models.ForeignKey(Advert, related_name='images')
image = models.ImageField(upload_to=generate_new_filename,
null=True, blank=True)
*forms.py*
from django.forms.models import inlineformset_factoryfrom django
import formsfrom django.forms import ModelForm, RadioSelect, TextInput
from .models import Advert, AdvertImage
class AdvertCategoryForm(ModelForm):
class Meta:
model = Advert
fields = ('category',)
class AdvertDetailsForm(ModelForm):
class Meta:
model = Advert
fields = ('title', 'description', 'location', 'adtype', 'price')
class AdvertImageForm(ModelForm):
class Meta:
model = AdvertImage
fields = ('image',)
AdvertImageFormset = inlineformset_factory(Advert, AdvertImage,
fields=('image',), can_delete=False, extra=3, max_num=3)
FORMS = [("ad_category", AdvertCategoryForm),
("ad_details", AdvertDetailsForm),
("ad_images", AdvertImageFormset)]
TEMPLATES = {"ad_category": "adverts/advert_category_step.html",
"ad_details": "adverts/advert_details_step.html",
"ad_images": "adverts/advert_images_step.html"}
*views.py*
...class AdvertWizard(LoginRequiredMixin, SessionWizardView):
form_list = FORMS
file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT))
def get_template_names(self):
return [TEMPLATES[self.steps.current]]
...
def done(self, form_list, **kwargs):
advert = Advert()
"""for form in form_list: for field, value in
form.cleaned_data.iteritems(): setattr(advert, field,
value)"""
form_dict = {}
for form in form_list:
form_dict.update(form.cleaned_data)
advert.owner = self.request.user
advert.save()
redirect(advert)
The problem occurs in the done method while saving the form:
ValueError at /ads/new
dictionary update sequence element #0 has length 3; 2 is required
Request Method:POSTRequest URL:http://localhost:8000/ads/newDjango Version:
1.7.1Exception Type:ValueErrorException Value:
dictionary update sequence element #0 has length 3; 2 is required
Exception
Location:/home/frank/Projects/python/django/pet_store/src/petstore/apps/adverts/views.py
in done, line 147Python Executable:
/home/frank/.virtualenvs/petstore/bin/pythonPython Version:3.4.0
-
/home/frank/Projects/python/django/pet_store/src/petstore/apps/adverts/views.py
in done
1.
form_dict.update(form.cleaned_data)
...
▶ Local vars <http://localhost:8000/ads/new#>
However, when I replace the following code:
form_dict = {}
for form in form_list:
form_dict.update(form.cleaned_data)
with this one
for form in form_list:
for field, value in form.cleaned_data.iteritems():
setattr(advert, field, value)
I now get the following error:
AttributeError at /ads/new
'dict' object has no attribute 'iteritems'
Request Method:POSTRequest URL:http://localhost:8000/ads/newDjango Version:
1.7.1Exception Type:AttributeErrorException Value:
'dict' object has no attribute 'iteritems'
Exception
Location:/home/frank/Projects/python/django/pet_store/src/petstore/apps/adverts/views.py
in done, line 140Python Executable:
/home/frank/.virtualenvs/petstore/bin/pythonPython Version:3.4.0Python Path:
['/home/frank/Projects/python/django/pet_store/src/petstore',
'/home/frank/.virtualenvs/petstore/lib/python3.4',
'/home/frank/.virtualenvs/petstore/lib/python3.4/plat-x86_64-linux-gnu',
'/home/frank/.virtualenvs/petstore/lib/python3.4/lib-dynload',
'/usr/lib/python3.4',
'/usr/lib/python3.4/plat-x86_64-linux-gnu',
'/home/frank/.virtualenvs/petstore/lib/python3.4/site-packages'
Server time:Thu, 22 Jan 2015 19:25:22 +0300
Probably this has to do with the images that have been added through
inlineformset, and the lack of iteritems method in Python 3.4.
How can I fix this to be able to save the object along with the images
through Django's FormWizard?
Thanks
P.S.: Apologies for the long post.
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/CAEAUGdVP32r2FTK%2BWt5QCJsQ4AxsmvpcuU6RfKWKVdAAPbjNrA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.