0

I have a model like this

class Ask(models.Model):
    name = models.CharField(max_length=500)
    designation = models.CharField(max_length=200, blank=True)
    email = models.EmailField()
    phone = models.CharField(max_length=20,  blank=True)
    avatar = models.ImageField(upload_to="ask/users/avaters", blank=True, )
    question = models.CharField(max_length= 1024)
    ques_time = models.DateField(auto_now_add=True)
    answer = models.TextField(blank=True)
    ans_time = models.DateField(blank=True,null=True, auto_now=True)
    display = models.BooleanField()
    asker_ip = models.CharField(max_length=100, blank=True)

    def __unicode__(self):
        return self.name

my forms.py is like this

class AskForm(forms.Form):
    name = forms.CharField(required=True, max_length= 500)
    email = forms.EmailField(required=True)
    avater = forms.ImageField()
    question = forms.CharField(required=True, max_length=1024)

my view is like this

def handle_uploaded_file(f):
    destination = open('D:/dsite/ak47/media/ask/users/avaters', 'wb+')
    for chunk in f.chunks():
        destination.write(chunk)
    destination.close()

def submit_page(request):
    data = {}

    if request.method == 'POST':
        data = request.POST.copy()
        form = AskForm(request.POST, request.FILES)
        if form.is_valid():
            ask = Ask()
            ask.name = form.cleaned_data['name']
            ask.email = form.cleaned_data['email']
            ask.question = form.cleaned_data['question']
            handle_uploaded_file(request.FILES['avater'])
            ask.save()
            return HttpResponseRedirect('/ask/')
        else:
            form = AskForm()

    return  render_to_response('ask/index.html', {'form': form,})

problem is in my windows development server. When I hit submit it give me a io error. Permission denied. I tried give the folder a full control permission. I'm assuming the error is for other reason. Because I can upload from admin panel.

4

1 回答 1

0

您正在尝试将文件保存到文件夹中,但未指定文件名。您的句柄功能应该是:

def handle_uploaded_file(f):
    save_path = 'D:/dsite/ak47/media/ask/users/avaters'
    destination = open(os.path.join(save_path,f.name), 'wb+')
    for chunk in f.chunks():
        destination.write(chunk)
    destination.close()

并且不要忘记在您的views.py顶部添加

import os

这种情况的另一种解决方案

使用ModelForm 及其功能您不必手动处理文件上传,它已经由 ModelForm 完成。您的forms.py应如下所示:

from .models import Ask


class AskForm(forms.ModelForm):
    class Meta:
        model = Ask
        fields = ('name', 'email', 'question', 'avater')

您的 views.py 应该如下所示:

def submit_page(request):
    if request.method == 'POST':
        form = AskForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/ask/')
    else:
        form = AskForm()

    return  render_to_response('ask/index.html', {'form': form,})

ModelForm 将自动处理所有提交的数据并为其创建/保存新的 Ask 对象。

于 2011-08-03T18:41:23.367 回答