0

最近、PythonとDjangoの実験を始めました。私はそれが好きで、すでにたくさんのことを学びましたが、それでもまだ長い道のりです...

5つの画像フィールドを含むモデルを作成しました。モデルの横に、データを入力して保存するためのフォームも作成しました。ここまでは順調ですね。次に、アップロードされた画像を「編集」するための別のフォームを作成します。つまり、次のようになります。

  1. 新しい画像をアップロードする
  2. データベースから「古い」画像を削除します

私は1つの画像の仕事をする以下のコードを書きました:

if form.is_valid():
            form_image = form.cleaned_data['image_1']
            try:
                details = Model.objects.get(pk=pk)
                if details.image_1 != form_image:
                    details.image_1.delete(save=False)
            except: pass # when new photo then we do nothing, normal case
            form.save()

しかし、私は次の問題に苦しんでいます:

  1. このコードを書き直して5つの画像フィールドを更新するにはどうすればよいですか?最悪の場合、5つの画像フィールドすべてを編集できるからです。'forループ'で試しましたが、成功しませんでした。例えば:

    image_list = [image_1, image_2, image_3, image_4, image_5]
    if form.is_valid():
        for image in image_list:
            form_image = form.cleaned_data[image]
            try:
                details = Model.objects.get(pk=pk)
                if details.image != form_image:
                    details.image.delete(save=False)
            except: pass # when new photo then we do nothing, normal case
            form.save()
    
  2. このロジックを書くためのよりインテリジェントな方法はありますか?このコードで私が抱えている問題は、画像の名前をチェックすることです。同じ名前の画像が複数あると、おそらくこれはうまくいきません...

うまくいけば、誰かがフィードバックをして、私を正しい方向に向けてくれることを願っています。

どうもありがとう!

敬具

4

1 に答える 1

1

文字列を使用する必要があります:

image_list = ['image_1', 'image_2', 'image_3', 'image_4', 'image_5']

# or doing that dynamically as well:
image_list = ['image_%d' % i for i in xrange(1,6)]

pkまた、あなたの例から、あなたが毎回ユニークな価値をどこで得ているのかわかりません。ただし、各ループがその特定の画像と比較するために異なるdetailsオブジェクトを生成する必要があると想定します。

考慮すべきことの1つは、毛布を使うことはほとんどないということですtry, except: pass。考慮しなかったエラーを簡単に隠すことができます。

try:
    details = Model.objects.get(pk=pk)
    ...
# django models have a special exception type
# when they don't exist.
except Model.DoesNotExist: 
    pass 

これらの文字列名を変数ルックアップとして動的に使用するには、次を使用する必要があります。getattr

for image_name in image_list:
    ...
    # equiv to: details.image_1, details.image_2, ...
    if getattr(details, image_name, None) != form_image:
    ...
于 2012-06-19T21:35:12.810 に答える