2013-06-22 51 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

相关问题