2013-06-22 79 views
3

我在包含ImageField的模型上使用了django ModelForm。爲了清楚起見,我在下面列出了一個通用版本,並且刪除了一些細節。這個方案對我來說工作得很好,我可以毫無問題地上傳和顯示模型中的圖像。Django ModelForm ImageField上傳不適用於移動設備

我在這種情況下的問題是,上傳不適用於移動設備。我已經在Iphone 4,Ipad 2和Android手機上進行了測試。沒有任何設備顯示任何錯誤,並且日誌中沒有錯誤,但是圖像無法上傳。

是否有人知道可能會導致此問題,或者如果這是ModelForms和ImageFields的已知問題?我真的想繼續使用ModelForms,因爲我有很多類似的模型,它使維護更容易,但我現在正在查看自定義選項。

Google至今沒有提供有用的信息。如果任何人都可以指出正確的方向來解決這個問題,將不勝感激。

我的模型看起來像這樣(爲了簡潔起見移除了某些字段):

class myModel(models.Model): 
    notes = models.CharField(max_length=2000) 
    image = models.ImageField(upload_to="room_images/") 
    last_updated = models.DateTimeField(auto_now=True) 

我的ModelForm看起來像這樣一個自定義文本區場:

class MyForm(forms.ModelForm): 
    notes = forms.CharField(widget=forms.Textarea, required=False) 

    class Meta: 
     model=MyModel 

我渲染的東西在的ModelForm與此類似(對象名稱更改爲通用等價物)。

<form id="myForm" action="{% url my_url %}?param_one={{ object.pk }}&param_two={{ anotherobject.pk }}" enctype="multipart/form-data" method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <input id="saveSomething" class="nice small blue button" type="submit" value="Save" /> 
</form> 

我的看法是這樣的(同樣一些東西剝離出去清晰度):

@login_required 
def object_edit(request): 
    object_id = request.GET.get('param_one', None) 
    object2_id = request.GET.get('param_two', None) 

    if object_id: 
     object = get_object_or_404(myModel, pk=object_id) 
     if obejct.userprofile.user != request.user: 
      return HttpResponseForbidden() 

    if object_id and object2_id != 'None': 
     other_object = get_object_or_404(OtherModel, pk=object_id) 
    else: 
     other_object = OtherModel(object=object) 

    if request.POST: 
     form = myForm(request.POST, request.FILES, instance=other_object) 
     if form.is_valid(): 
      form.save() 
+0

您是否嘗試從'ModelForm'中刪除'ImageField'來確認它是導致問題的'ImageField'? –

+0

表單工作正常,它只是上傳失敗的圖片,所以不會真正起到幫助作用。 – CIGuy

+0

我很想聽聽已成功使用ModelForm ImageField上傳移動設備的人。 – CIGuy

回答

0

通過觀察Form and File Uploading in DjangoWhat does data-ajax="false" really do?,看來您的問題來自jQuery Mobile的。

默認情況下,JQM將嘗試通過ajax加載頁面以改善用戶體驗和轉換。

顯然,當你郵寄到在Django相同的URL,並要手動處理它,你必須包括

data-ajax="false" 

在你的情況,這將意味着改變你的模板:

<form id="myForm" 
     action="{% url my_url %}?param_one={{ object.pk }}&param_two={{ anotherobject.pk }}" 
     enctype="multipart/form-data" 
     method="post" 
     data-ajax="false"> <!-- change is here --> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <input id="saveSomething" class="nice small blue button" type="submit" value="Save" /> 
</form> 

docs

這告訴框架做一個完整的頁面重新加載清除Ajax散列在URL中

我沒有嘗試過自己,我只是從搜索中獲得信息。

+0

我沒有機會自己測試這個,但你的解釋聽起來似乎合理,沒有人提供了另一種選擇,所以我會給你賞金。感謝您對此的研究,一旦我有機會進行測試,我也會標記爲答案。 – CIGuy

相關問題