簡體   English   中英

從Django表單上載Windows開發服務器中的圖像

[英]from django form uploading a image in windows development server

我有這樣的模特

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錯誤。 沒有權限。 我嘗試賦予該文件夾完全控制權限。 我假設錯誤是由於其他原因。 因為我可以從管理面板上傳。

您正在嘗試將文件保存到文件夾中,但未指定文件名。 您的句柄函數應為:

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對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM