2016-08-11 4 views
0

私はDjangoで基本的なブログプラットフォームを作っています。新しい編集バージョンを保存できる編集ページを追加しました。また、削除オプションも追加しました。削除ボタンがクリックされると、削除の確認またはキャンセルを求める新しいテンプレートがレンダリングされます。 「はい」をクリックすると、必要に応じて投稿が削除されます。「いいえ」をクリックすると、「編集」ページに戻ります。問題は、 '編集'ページに戻ってそこにあるフォームにデータが入力されなくなると、すべてのフィールドが空になることです。すべてのデータが入力された状態で「編集」ページに戻るための「いいえ」オプションを設定できる方法はありますか?質問が不明な場合はアドバイスをお願いします。ありがとうございました。 .models輸入ブログからDjangoのインポートフォーム から2回目のDjangoフォームの再作成

views.py

def edit_post(request, slug): 

    post=get_object_or_404(Blog, slug=slug) 
    form = BlogForm(request.POST or None, instance=post) 

    context = { 
     'title': post.title, 
     'post': post, 
     'form': form, 
     } 

    if 'save' in request.POST: 
     if form.is_valid(): 
      post=form.save(commit=False) 
      post.save() 
      return HttpResponseRedirect(post.get_absolute_url()) 

    elif 'delete' in request.POST: 
     return render(request, 'Blog/confirm-deletion.html',delete_context) 

    #Now delete template is shown, and view takes 'yes' or 'no' option 

    elif 'yes' in request.POST: 
     post.delete() 
     messages.success(request, 'Post was successfully deleted') 
     return HttpResponseRedirect(reverse('post_list')) 

    elif 'no' in request.POST: 
     form = BlogForm(request.POST, instance=post) 
     context = { 
      'title': post.title, 
      'post': post, 
      'form': form, 
      } 
     return render(request, 'Blog/edit_post.html', context) 
     #PROBLEM HERE: CAN'T GET *NO* OPTION TO RETURN TO FILLED OUT FORM PAGE 

return render(request, 'Blog/edit_post.html', context) 

確認-deletion.html

{% extends 'Blog/base.html' %} 

{% block content %} 
<form method='POST' action = '' enctype='multipart/form-data'> {% csrf_token%} 
    <p>Are you sure you want to delete {{title}}?</p> 
    <input type = 'submit' name = 'yes' value = 'Yes'/> 
    <input type = 'submit' name = 'no' value = 'No'/> 
</form> 

{% endblock %} 

forms.py

class BlogForm(forms.ModelForm): 
    class Meta: 
     model = Blog 
     fields = [ 
     'title', 
     'category', 
     'content', 
     'draft' 
     ] 
+0

をクリックすると「NO」、つまり '

'タグ内のすべてのフィールドがしますサーバーに提出する必要があります。ブログフォームフィールドを提出する場合は、同じタグにフォームを配置する必要があります。 – Alasdair

+0

@ Alasdairので、「編集」ページに再送信される情報は、ブログフォームではなく「はい/いいえ」フォームから来ています。なぜフィールドが空白になっているのでしょうか? –

+0

@ Alisdairは、それを試しただけで完璧に動作します。あなたが答えとしてあなたのコメントを残したいのであれば、私はそれを最も役に立つものとして選択します。あなたの助けに大変感謝します。 –

答えて

0

フォームを送信すると、その<form>タグのフィールドのみが送信されます。たとえば、ページ上の2個のフォームタグを持っていると言う:あなたは「いいえ」ボタンをクリックしない場合、彼らは別のformタグであるため、

<form method='POST' action = '' enctype='multipart/form-data'> 
    {% csrf_token%} 
    {{ form }} 
    <input type='submit' name='submit' value='Submit' /> 
</form> 

<form method='POST' action = '' enctype='multipart/form-data'> {% csrf_token%} 
    <p>Are you sure you want to delete {{title}}?</p> 
    <input type = 'submit' name = 'yes' value = 'Yes'/> 
    <input type = 'submit' name = 'no' value = 'No'/> 
</form> 

、投稿フォームからのフィールドは、提出されることはありません。あなたが「いいえ」、あなたは同じタグでフォームを含める必要がクリックしたときに

は、フォームデータを提出するには、次の

<form method='POST' action = '' enctype='multipart/form-data'> 
    {% csrf_token%} 
    {{ form }} 
    <input type='submit' name='submit' value='Submit' /> 
    <p>Are you sure you want to delete {{title}}?</p> 
    <input type = 'submit' name = 'yes' value = 'Yes'/> 
    <input type = 'submit' name = 'no' value = 'No'/> 
</form> 
0

私はあなたのコードを誤解しているかもしれませんが、なぜelif 'no'節でフォームを再作成していますか?新しいアラートウィンドウでは、「削除」ヒットすると

elif 'no' in request.POST: 
    pass 
+0

残念ながら、「いいえ」がクリック/選択されていない場合、ユーザーは「はい」または「いいえ」が選択されるまで 'confirm-deletion.html'ページに留まります。だから、もし私が 'no'に_pass_を使うと、ブラウザの戻るボタンを使わない限り(元々は編集していないので、私はむしろそれを避けるだろう) –

+0

@MattCraigなぜですか? "return render(request、 'Blog/edit_post.html'、context)という行を実行しませんか? 私が見る別の解決策は、単にrequest.POSTをクリアし、それを使ってedit_post関数を呼び出すことです。 –

0

出てくるん?実際には、そのコードはすでに行われていて、あなただけのような何かを行うことができないものを繰り返していませんかそうであれば、「いいえ」ボタンを送信ボタンにする代わりに、アラートボックスを閉じることができます。もしそれが新しいHTMLフォームを開いているなら、window.close()のようなものかもしれません。

+0

今のところ、新しいテンプレート/ htmlページをレンダリングしているだけなので、「削除」が選択されていると、サーバーは新しいページを読み込みます。それは良いアイデアですが、後でそれをJavaScriptで設定することになります(Django/Pythonでうまくいく方法がない限り)。 –

関連する問題