3

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 は、1 つのカスタム 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()
4

1 に答える 1

0

Djangoでのフォームとファイルのアップロードと、 data -ajax="false" は実際には何をするのでしょうか? 、あなたの問題は jQuery Mobile から来ているようです。

デフォルトでは、JQM は ajax 経由でページをロードして、ユーザー エクスペリエンスとトランジションを改善しようとします。

どうやら、Django で同じ URL に POST し、手動で処理したい場合は、

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>

ドキュメントから:

これは、URL の Ajax ハッシュをクリアするためにページ全体のリロードを実行するようにフレームワークに指示します。

私は自分で試したのではなく、SOを検索して情報を得ただけです。

于 2013-07-17T23:05:42.363 に答える