из формы django, загружающей изображение в сервер разработки Windows - PullRequest
0 голосов
/ 03 августа 2011

У меня есть такая модель

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

мой forms.py такой

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)

мой взгляд такой

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,})

проблемав моем сервере разработки Windows.Когда я нажимаю "Отправить", выдается ошибка IO.Доступ запрещен.Я попытался дать папке полное разрешение на управление.Я предполагаю, что ошибка по другой причине.Потому что я могу загрузить из админ-панели.

1 Ответ

0 голосов
/ 03 августа 2011

Вы пытаетесь сохранить файл в папку, но не указали имя файла.Ваша функция дескриптора должна быть:

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 для него.

...