2009-02-03 48 views
10

我一直在嘗試help(django.db.models.ImageField)dir(django.db.models.ImageField),尋找如何從上傳的圖片創建一個ImageField對象。Django - 如何將InMemoryUploadedFile轉換爲ImageField的FieldFile?

request.FILES具有圖像爲InMemoryUploadedFile,但我試圖保存包含ImageField的模型,所以我怎麼轉InMemoryUploadedFileImageField

你如何去尋找這種類型的東西呢?我懷疑這兩個類有一個繼承關係,但我必須做很多dir() -ing來確定我是否要看。

回答

3

你試圖在ModelForm中做到這一點?

我這是怎麼做到的文件中的字段

class UploadSongForm(forms.ModelForm): 
    class Meta: 
     model = Mp3File 

    def save(self): 
     content_type = self.cleaned_data['file'].content_type 
     filename = gen_md5() + ".mp3" 
     self.cleaned_data['file'] = SimpleUploadedFile(filename, self.cleaned_data['file'].read(), content_type) 
     return super(UploadSongForm, self).save() 

你可以把它作爲例子,在源看在初始化參數是什麼InMemoryUploadedFile類的需求。

+0

謝謝,我會看看到實例更緊密的明天。我正在繞過表單過程,因爲我試圖保存用戶上傳圖片兩次,所以不能執行的清潔數據的事情。 – 2009-02-03 09:24:20

1

您可以通過使用表單實例實現一個文件上傳字段的形式,這裏是視圖:

def form_view(request): 
    if request.method == 'POST': 
     form = FooForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      return render_to_response('result.html') 
     return render_to_response('form.html', { 
      'form': form; 
      'error_messages': form.errors; 
     } 
    form = FooForm() 
    return render_to_response('form.html', { 
     'form': form; 
    } 

form.save()保存上傳的文件與其他所有領域,當您包括request.FILES它的構造函數中的參數。在你的模型必須定義FooForm的ModelForm類是這樣的:

class FooForm(ModleForm): 
    Meta: 
     model = Foo 

...其中foo是型號,描述要持久保存數據的子類。

16

您需要保存InMemoryUploadedFileImageField而不是 '轉向' 它變成一個ImageField

image = request.FILES['img'] 
foo.imagefield.save(image.name, image) 

其中是模型的實例,並的ImageFieldImageField

另外,如果你是拉出來的圖像的一種形式:

image = form.cleaned_data.get('img') 
foo.imagefield.save(image.name, image) 
+0

這個答案不正確。呦可以根據需要使用文件內容,而不必將其保存在模型實例中。檢查文件屬性 – Imnl 2016-10-11 09:38:05