Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
739 views
in Technique[技术] by (71.8m points)

javascript - Model has no attribute _committed

I'm using jquery form plugin http://jquery.malsup.com/form/#getting-started to upload images through ajax. When I try to upload it shows the model has no attribute _committed Here is my Html:

<form id="uploadform" method="post" enctype="multipart/form-data" action="/cover/">{% csrf_token %}
        {{ form.background }}
</form>

Javascript:

https://gist.github.com/2381406

Models.py:

class BackgroundModel(models.Model):
    user = models.OneToOneField(User)
    background = models.ImageField(upload_to='backgrounds')

class BackgroundModelForm(ModelForm):
    class Meta:
        model = BackgroundModel
        exclude = ('user',)

Views.py:

@login_required
def backgroundview(request):
    if request.is_ajax():
        form = BackgroundModelForm(request.POST, request.FILES)
        if form.is_valid():
            try:
                g = BackgroundModel.objects.get(user=request.user)
            except BackgroundModel.DoesNotExist:
                data = form.save(commit=False)
                data.user = request.user
                data.save()
            else:
                g.background = form
                g.save()
            HttpResponse(" ")
    else:
        form = BackgroundModelForm()
    return render_to_response("cover.html", {'form': form}, context_instance=RequestContext(request))

Urls.py:

url(r'^cover/$', 'cover.views.backgroundview'),
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Instead of g.background = form in the else branch, try

try:
    g = BackgroundModel.objects.get(user=request.user)
except BackgroundModel.DoesNotExist:
    data = form.save(commit=False)
    data.user = request.user
    data.save()
else:
    g.background = form.save(commit=False).background
    g.save()
    # or
    BackgroundModelForm(request.POST, request.FILES, instance=g).save()

Only a value of accepted types could be assigned to corresponding field of a model instance.
models.ImageField here accepts

  • file path string
  • django.db.models.fields.files.ImageFieldFile
  • django.core.files.images.ImageFile

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...