Hi,

Use items() instead of iteritems().

Collin

On Thursday, January 22, 2015 at 11:31:23 AM UTC-5, Frankline wrote:
>
> ​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/6cfff14b-17b7-44b6-bb2a-74bdf7b467df%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to