2017-03-02 98 views
0

在無法子類Page的Django模型中,我想將現有的ImageField轉換爲使用W images圖像。我已將該字段重新定義爲:從w outside外側上傳W images圖像

avatar = models.ForeignKey(
    'wagtailimages.Image', null=True, on_delete=models.SET_NULL, related_name='+' 
) 

用戶需要能夠將圖像上載到其配置文件視圖。在forms.py的Django的觀點,我有:

avatar = forms.ImageField(
    label='Your Photo', required=False, 
    error_messages={'invalid': "Image files only"}, widget=forms.FileInput()) 

當我上傳的圖像來看,它崩潰上:

Cannot assign "<InMemoryUploadedFile: filename.jpg (image/jpeg)>": 
"UserProfile.avatar" must be a "Image" instance. 

我敢肯定,問題是字段定義在形式中,但我無法弄清楚正確的定義應該是什麼。

我知道我需要手動將圖像附加到UserProfile和Collection,但需要首先通過此錯誤。或者嘗試在非WT模型中使用單個WT字段是一個壞主意?謝謝。

回答

3

這裏的問題是您的模型上的avatar ForeignKey字段預計會收到wagtailimages.Image模型的實例。表單上的ImageField無法提供此功能 - 它僅提供文件對象。爲了使這個工作,你需要設置你的表單(我假設是一個ModelForm)來創建wagtailimages.Image對象與您自己的模型同時。應該可以用自定義save的方法來做到這一點,如下所示:

  • 重命名avatar = forms.ImageField的東西,不與avatar模型場交鋒,如avatar_image
  • 確保avatar_image包含在您的ModelForm的fields定義,但avatar不是。此時,avatar_image只是表單上的一個附加字段,與模型無關。
  • 定義以下save方法上的ModelForm:

    from wagtailimages.models import Image 
    
    def save(self, commit=False): 
        if not commit: 
         raise Exception("This form doesn't support save(commit=False)") 
    
        # build the instance for this form, but don't save it to the db yet 
        instance = super(MyForm, self).save(commit=False) 
    
        # create the Image object 
        avatar = Image.objects.create(
         file=self.cleaned_data['avatar_image'], 
         title="Image title" 
         # you may need to add more fields such as collection to make it a valid image... 
        ) 
    
        # attach the image to your final model, and save 
        instance.avatar = avatar 
        instance.save() 
        return instance 
    
+0

啊,是有道理的,這是一個優雅的辦法。完美的作品,謝謝! – shacker