Django ModelForm ImageField Upload 不适用于移动设备

标签 django mobile django-forms django-models

我在包含 ImageField 的模型上使用 django ModelForm。为了清楚起见,我在下面提供了一个通用版本,删除了一些细节。这个方案对我来说效果很好,我可以毫无问题地上传和显示模型中的图像。

在这种情况下,我的问题是无法从移动设备上传。我已经在 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 看起来像这样,带有一个自定义 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>

我的 View 如下所示(为了清晰起见,再次删除了一些内容):

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

最佳答案

通过查看Form and File Uploading in DjangoWhat does data-ajax="false" really do? ,您的问题似乎来自 jQuery Mobile。

JQM 默认情况下会尝试通过 ajax 加载页面,以改善用户体验和转换。

显然,当您在 Django 中 POST 到相同的 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 :

This tells the framework to do a full page reload to clear out the Ajax hash in the URL

我自己没有尝试过,我只是通过搜索得到的信息。

关于Django ModelForm ImageField Upload 不适用于移动设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17247071/

相关文章:

Django 模型 order_by 非数据库字段

javascript - 从另一个选择框填充一个选择框并使用数据库连接

python - Django 包含标签语法错误

android 在创建媒体播放器时出错?

python - 在 Django 表单中处理优雅降级

python - 如何避免 AppConfig.ready() 方法在 Django 中运行两次

jquery - 如何使用 jquery-mobile 获取点击事件的位置/坐标?

css - 针对目标移动设备(首先)、平板电脑和台式机的特定媒体查询

json - 如何在 Django 中序列化(JSON)文件字段

django-forms - Django-bootstrap3 错误 "should contain a valid Django Form"