Django ModelForm ImageField上传不适用于移动设备

时间:2013-06-22 03:31:44

标签: django mobile django-forms django-models

我在包含ImageField的Model上使用django ModelForm。我在下面列出了一个通用版本,其中一些细节是为了清晰起见而删除的。这个方案对我来说很好,我可以从模型上传和显示图像,没有任何问题。

我遇到的问题是上传无法通过移动设备运行。我已经在Iphone 4,Ipad 2和Android手机上进行了测试。没有任何设备显示任何错误,并且日志中没有错误,但图像无法上传。

有人知道可能导致此问题的原因,或者这是ModelForms和ImageFields的已知问题吗?我真的想继续使用ModelForms,因为我有很多类似的模型,它使维护更容易,但我现在正在寻找自定义选项。

到目前为止,谷歌还没有提供任何有用的信息。如果有人能够指出正确的方向来解决这个问题,那将非常感激。

我的模型看起来像这样(为简洁起见,删除了一些字段):

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看起来像这样,有一个自定义的TextArea字段:

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()

1 个答案:

答案 0 :(得分: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

  

这告诉框架执行整页重新加载以清除URL中的Ajax哈希

我自己没有尝试过,我只是从搜索SO中获得了信息。