2016-05-30 12 views
-2

私はtodoアプリケーションを作成しようとしています。このフォームに "todo"を追加できるテーブルがあるフォームがあります。クリックしてオブジェクトを削除する

ユーザを別のページにリダイレクトせずにボタンをクリックすることで、追加された "todo"をデータベースから削除したいと思います.Djangoでこれを行う方法はありますか?

http://postimg.org/image/8dpe1dcob/

Views.py

from django.shortcuts import render 
from django.utils import timezone 
from .models import Task 
from .forms import TaskForm 
from django.shortcuts import redirect 
from django.http import HttpResponseRedirect 
from django.shortcuts import get_object_or_404 
from django.core.urlresolvers import reverse 

# Create your views here. 

def tasks_list(request): 
    tasks = Task.objects.filter(created_date__lte=timezone.now()).order_by('created_date') 
    form = TaskForm() 
    if request.method == "POST": 
     form = TaskForm(request.POST) 
     if form.is_valid(): 
      post = form.save(commit=False) 
      post.created_date = timezone.now() 
      post.save() 
      #return render(request, 'todo/tasks_list.html', {'tasks': tasks, 'form': form}) 
      return HttpResponseRedirect('/') 
    else: 
     form = TaskForm() 
    return render(request, 'todo/tasks_list.html', {'tasks': tasks, 'form': form}) 




def post_remove(request, new_id): 
    post = get_object_or_404(Task, id=new_id) 
    post.delete() 
    return redirect('todo.views.tasks_list') 

url.py

from django.conf.urls import url 
from . import views 

urlpatterns = [ 
    url(r'^$', views.tasks_list, name='tasks_list'), 
    #url(r'^$', views.tasks_list, name='post_remove'), 
] 

form.py

from django import forms 
from .models import Task 

class TaskForm(forms.ModelForm): 
    title = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Add todo'}), label='') 
    due_date = forms.DateField(widget=forms.DateInput(attrs={'placeholder': 'Add due date', 'class':'datepicker'}), label='') 

    class Meta: 
     model = Task 
     fields = ('title', 'due_date',) 

テンプレート/ task_list.html

{% extends 'todo/base.html' %} 
{% load bootstrap %} 

{% block content %} 
<h1>Todos</h1> 
<div class="container" id="container"> 
    <div class="input-group"> 
    <!--<input type="text" class="form-control" id="textField" placeholder="Add tasks">--> 
    <form method="POST" class="post-form" >{% csrf_token %} 
     {{ form|bootstrap }} 

     <span class="input-group-btn"> 
     <button class="btn btn-default" type="submit" id="plusSign">Go!</button> 
     </span> 
     </form> 
    </div><!-- /input-group --> 
    <table style="width:100%" id='todoTable'> 
    <thead id="tableHead"> 
     <tr> 
     <td>Todo</td> 
     <td>due date</td> 
     <td>delete</td> 
     </tr> 
    </thead> 
    <tbody> 
    {% for task in tasks %} 
    <tr> 
     <td>{{ task.title }}</td> 
     <td> {{ task.due_date }} </td> 
     <td> <a class="btn btn-default" href="{% url 'tasks_list' %}"><span class="glyphicon glyphicon-remove"></span></a> </td> 
    </tr> 
    </body> 
    {% endfor %} 
    </table> 
</div> 
{% endblock %} 

編集:

私は、Djangoの女の子のチュートリアルからコードを使用して解決策を見つけました。

Views.py

def post_remove(request, pk): 
    post = get_object_or_404(Task, pk=pk) 
    post.delete() 
    return HttpResponseRedirect('/') 

Url.py task_list.html

url(r'^task/(?P<pk>\d+)/remove/$', views.post_remove, name='post_remove'), 

テンプレート/

<td> <a class="btn btn-default" href="{% url 'post_remove' pk=task.pk %}"><span class="glyphicon glyphicon-remove"></span></a></td> 

でした誰もチェック:

私は、次のコードを追加しました私の理解が削除は正しいですか?

のでtask_list.htmlは、特定のhrefでのみ「TODO」を削除するviews.pyにpost_remove機能を可能とするため、ボタンがクリックされたときに除去のみ機能href="/task/49/remove/"として各TODOに主キーとのリンクを追加していますpost_remove関数のリクエストパラメータ?

答えて

1

はい。 ajaxを使用すると、削除ビューを呼び出すだけで、データベースにアクセスしてそのエントリを削除することができます。ちょうどそれをクライアント側でjavascriptで削除します。

たとえば、django-rest-frameworkangularjsとすると、車輪を改革しないようにしたり、アプリをさらに改善するための柔軟性を追加することができます。コールバックを追加して、すべてがサーバー側で正しく行われたことを確認できます。

出血したい場合は、django-channelsをご覧ください。

+0

ありがとうございました! 私の編集を見ていただけますか? – Squexis

+0

あなたのコードを見ると正しいように見えますが、リンクをクリックすると、ユーザーは ''/'' URLにリダイレクトされます。あなたの質問は、ページリロードのない「タスク」を直接削除することを目的としたものではありませんか? –

関連する問題