Caspian
Caspian

Reputation: 703

TypeError at images/create - __init__() got an unexpected keyword argument 'save'

I don't know what's wrong here. I'm trying to save images from other websites to my database, but I get TypeError at images/create - __init__() got an unexpected keyword argument 'save'. images is an app and create is name of the url. Here's the code

urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^create/$', views.image_create, name='create'),
] 

views.py

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from .forms import ImageCreateForm

@login_required
def image_create(request):
    if request.method == 'POST':
        # Form is sent
        form = ImageCreateForm(data=request.POST)
        if form.is_valid():
            # Form data is valid
            cd = form.cleaned_data
            new_item = form.save(commit=False)

            # Assign current user to the item
            new_item.user = request.user
            new_item.save()
            messages.success(request, 'Image added successfully')

            # Redirect to the newly created item detail view
            return redirect(new_item.get_absolute_url())
    else:
        # Build form with data provided by the bookmarklet via GET
        form = ImageCreateForm(data=request.GET)

    return render(request, 'images/image/create.html',
    {'section' : 'images', 'form' : form})

and the forms.py which also contains code to override the save() method

from urllib import request
from django import forms
from django.core.files.base import ContentFile
from django.utils.text import slugify
from .models import Image

class ImageCreateForm(forms.ModelForm):
    class Meta:
        model = Image
        fields = ('title', 'url', 'description')
        widgets = {
            'url' : forms.HiddenInput,
        }

    def clean_url(self):
        url = self.cleaned_data['url']
        valid_extensions = ['jpg', 'jpeg']
        extension = url.rsplit('.', 1)[1].lower()
        if extension not in valid_extensions:
            raise forms.ValidationError('the given URL doesn\'t match valid image extensions')
        return url

    def save(self, force_insert=False, force_update=False, commit=True):
        image = super(ImageCreateForm, self).save(commit=False)
        image_url = self.cleaned_data['url']
        image_name = '{}.{}'.format(slugify(image.title),
        image_url.rsplit('.', 1)[1].lower())

        # Download image from given URL
        response = request.urlopen(image_url)
        image.image.save(image_name, ContentFile(response.read(), save=False))

        if commit:
            image.save()
        return image

Somebody help please!

Upvotes: 2

Views: 1537

Answers (1)

Moses Koledoye
Moses Koledoye

Reputation: 78536

ContentFile takes no keyword save in its __init__:

ContentFile(response.read(), save=False)
#                            ^^^ ????

Upvotes: 4

Related Questions