2017-02-12 15 views
0

削除:次のようにこのテンプレートのビューがあるDjangoは私が私がファイルをアップロードしても、下の削除ボタンで画像を表示することができ、次のテンプレートを持っているファイル

<div class="col-md-12 col-md-offset-0"> 
    <form method="post" enctype="multipart/form-data"> 
     {% csrf_token %} 
     <div class="col-xs-12 col-md-5 col-md-offset-0">{{ form.document }}</div> 
     <div class="col-xs-12 col-md-1 col-md-offset-0"><button type="submit" >Upload</button></div> 
    </form> 

    {% for image in images %} 
    <div class="col-md-1 col-md-offset-0"> 
     <img style="width: 100%;" src='{{MEDIA_URL}}/{{ username }}/{{image}}' alt="ID Image"/> 
     <div style="text-align: center;"><button type = "button" class = "btn btn-danger btn-sm">Delete</button></div> 
    </div> 
    <!-- Indicates a dangerous or potentially negative action --> 

    {% endfor %} 
    </div> 

を:

@login_required 
def profile(request, extra_context={}): 
    path="media/" + request.user.username + "/" # insert the path to your directory 

    if (os.path.isdir(path)): 
     num_files = len([f for f in os.listdir(path) 
        if os.path.isfile(os.path.join(path, f))]) 
     img_list =os.listdir(path) 

    else: 

     num_files = 0 
     img_list = "" 

    username = request.user.username 


    if request.method == 'POST': 
     form = DocumentForm(request.POST, request.FILES) 
     if form.is_valid(): 
      obj = form.save(commit=False) 
      obj.user = request.user 
      obj.save() 
      return redirect('profile') 
    else: 
     form = DocumentForm() 
     form_address = ProfileFormAddress() 
    return render(request, 'meta/profile.html', { 
        'form': form, 
        'images': img_list, 
        'username': username, 
        'num_files': num_files, 
        'form_address': form_address, 
        }) 

削除ボタンは何もしません。私はクリックしたときにそのボタンに関連付けられているファイルを削除する、各ボタンのフォームを作成する必要があると感じています。誰かがそれを助けることができるなら、それは素晴らしいだろう。

答えて

0

このアクションを処理するには、必ず少なくともフォームを作成する必要があります。

これは複数の方法で実行できます。

  1. 方法=「DELETE」とパラメータと画像名を渡すとHTTP動詞をDELETE即ち形式を使用。コード内で適切に処理してください。多くのブラウザではフォームの送信はこれでは機能しません。

  2. 別のビュー/プロファイルを作成//写真//削除してPOSTを設定して削除します。

私はあなたがそれを得ると感じるようにコードを共有しません。

+0

多くのおかげで、私はあなたが説明した方法でそれをしませんでしたが、あなたの答えは私が考えるようになったと来ました解決策を提示する。 –

0

ビップルは私の考えを得て、私は各ボタンをフォームにすることができると決めました。ファイル名を使って各フォームに名前を付けると、単に各ファイルをループし、ボタンの押された名前と一致するファイルを単に削除することができます。

テンプレートは、次のように:

 {% for image in images %} 
     <form method="post" enctype="multipart/form-data"> 
      {% csrf_token %} 
      <div class="col-md-1 col-md-offset-0"> 
       <img style="width: 100%;" src='{{MEDIA_URL}}/{{ username }}/{{image}}' alt="ID Image"/> 
        <div style="text-align: center;"><button type = "submit" name = "{{image}}" class = "btn btn-danger btn-sm">Delete</button></div> 
      </div> 
     </form> 
     {% endfor %} 

ビューを次のように情報を

@login_required 
def profile(request, extra_context={}): 
    path="media/" + request.user.username + "/" # insert the path to your directory 

    if (os.path.isdir(path)): 
     num_files = len([f for f in os.listdir(path) 
        if os.path.isfile(os.path.join(path, f))]) 
     img_list =os.listdir(path) 

    else: 

     num_files = 0 
     img_list = "" 

    username = request.user.username 

    if request.method == 'POST' and 'upload' in request.POST: 
     form = DocumentForm(request.POST, request.FILES) 
     if form.is_valid(): 
      obj = form.save(commit=False) 
      obj.user = request.user 
      obj.save() 
      return redirect('profile') 
    elif request.method == 'POST' and 'address' in request.POST: 
     return redirect('profile') 
    elif request.method == 'POST': 


     for image in img_list: 
      if image in request.POST: 
       os.remove("media/" + request.user.username + "/" + image) 

     return redirect('profile') 

    else: 
     form = DocumentForm() 
     form_address = ProfileFormAddress() 

    return render(request, 'meta/profile.html', { 
        'form': form, 
        'images': img_list, 
        'username': username, 
        'num_files': num_files, 
        'form_address': form_address, 
        }) 
関連する問題