Django DeleteView 不要从数据中删除对象
Django DeleteView don't delete the object from data
首先感谢您抽出宝贵时间。
我刚刚学习了 CreateView UpdateView 和 DeleteView 模型。我让他们所有人都在工作。我可以更改我的对象我可以删除它们但是在删除一个对象之后我尝试创建另一个并创建一个像以前一样没有被删除的对象。给我以下删除之前的 pk
虽然现在 pk 应该是 3,但它仍然会创建 de object,我想在我点击 delete 按钮并确认删除后它不会从数据中删除。
这些是我的模型:
> from django.db import models from django.urls import reverse
>
>
>
> class Dreams (models.Model):
> titulo = models.CharField(max_length=100)
> objetivo = models.CharField(max_length=100)
> imagem = models.CharField(max_length=100)
>
> def get_absolute_url(self):
> return reverse ('webdeve:index', kwargs={'pk': self.pk})
>
> def __str__(self):
> return self.titulo + ' - ' + self.objetivo
>
>
> class Wich (models.Model):
> lets = models.ForeignKey(Dreams, on_delete=models.CASCADE)
> make = models.CharField(max_length=100)
> it = models.CharField(max_length=100)
> favorite = models.BooleanField(default=False)
>
> def __str__(self):
> return self.make
我的views.py:
from django.views import generic
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from .models import Dreams, Wich
from django.urls import reverse_lazy
class IndexView (generic.ListView):
template_name = 'index.html'
def get_queryset(self):
return Dreams.objects.all()
class DetailView (generic.DetailView):
model = Dreams
template_name = 'detail.html'
class DreamCreate (CreateView):
model = Dreams
fields = ['titulo', 'objetivo', 'imagem']
template_name = 'dreams_form.html'
class DreamUpdate (UpdateView):
model = Dreams
fields = ['titulo', 'objetivo', 'imagem']
template_name = 'dreams_form.html'
class DreamDelete (DeleteView):
model = Dreams
template_name= ('dreams_confirm_delete.html')
success_url= reverse_lazy('webdeve:index')
我的urls.py:
from django.conf.urls import url
from webdeve import views
app_name = 'webdeve'
# Dreams
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
# Dreams/detail
url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
# Dreams/detail/add
url(r'^dream/add/$', views.DreamCreate.as_view(), name='dream-add'),
# Dreams/detail/Update
url(r'^dream/(?P<pk>[0-9]+)/$', views.DreamUpdate.as_view(), name='dreams-uptdate'),
# Dreams/detail/detete
url(r'^dream/(?P<pk>[0-9]+)/delete/$', views.DreamDelete.as_view(), name='dreams-delete'),
]
我的 index.html 带有删除按钮:
<!-- linkando css no html -->
{% extends 'base.html' %}
{% block nav %}
<ul>
{% for Dreams in object_list %}
<a href="{% url 'webdeve:detail' Dreams.id %}"><img src={{ Dreams.imagem }}></a>
<li><a href="{% url 'webdeve:detail' Dreams.id %}"> {{ Dreams.titulo }} - {{ Dreams.objetivo }} </a><li>
<!--delete BUTTON-->
<form action="{% url 'webdeve:dreams-delete' Dreams.id %}">
{% csrf_token %}
<input type="hidden" name="dreams_id" value="{{ Dreams.id }}" method="post" style="display: inline" >
<button type="submit" class="btn btn-default btn-sm">
<span class="glyphicon glyphicon-trash"></span>
</button>
</form>
{% endfor %}
</ul>
{% endblock %}
DeleteView
仅在 POST 上删除您的对象,而不是 GET。因此,您需要在表单中使用 method="post"
,因为 GET 会再次呈现此 confirm_delete.html。
<form method="post" action="">
...
</form>
如果您可以通过 GET 进入 DeleteView,action=""
是您 POST 所需要的全部。
首先感谢您抽出宝贵时间。 我刚刚学习了 CreateView UpdateView 和 DeleteView 模型。我让他们所有人都在工作。我可以更改我的对象我可以删除它们但是在删除一个对象之后我尝试创建另一个并创建一个像以前一样没有被删除的对象。给我以下删除之前的 pk
虽然现在 pk 应该是 3,但它仍然会创建 de object,我想在我点击 delete 按钮并确认删除后它不会从数据中删除。
这些是我的模型:
> from django.db import models from django.urls import reverse
>
>
>
> class Dreams (models.Model):
> titulo = models.CharField(max_length=100)
> objetivo = models.CharField(max_length=100)
> imagem = models.CharField(max_length=100)
>
> def get_absolute_url(self):
> return reverse ('webdeve:index', kwargs={'pk': self.pk})
>
> def __str__(self):
> return self.titulo + ' - ' + self.objetivo
>
>
> class Wich (models.Model):
> lets = models.ForeignKey(Dreams, on_delete=models.CASCADE)
> make = models.CharField(max_length=100)
> it = models.CharField(max_length=100)
> favorite = models.BooleanField(default=False)
>
> def __str__(self):
> return self.make
我的views.py:
from django.views import generic
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from .models import Dreams, Wich
from django.urls import reverse_lazy
class IndexView (generic.ListView):
template_name = 'index.html'
def get_queryset(self):
return Dreams.objects.all()
class DetailView (generic.DetailView):
model = Dreams
template_name = 'detail.html'
class DreamCreate (CreateView):
model = Dreams
fields = ['titulo', 'objetivo', 'imagem']
template_name = 'dreams_form.html'
class DreamUpdate (UpdateView):
model = Dreams
fields = ['titulo', 'objetivo', 'imagem']
template_name = 'dreams_form.html'
class DreamDelete (DeleteView):
model = Dreams
template_name= ('dreams_confirm_delete.html')
success_url= reverse_lazy('webdeve:index')
我的urls.py:
from django.conf.urls import url
from webdeve import views
app_name = 'webdeve'
# Dreams
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
# Dreams/detail
url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
# Dreams/detail/add
url(r'^dream/add/$', views.DreamCreate.as_view(), name='dream-add'),
# Dreams/detail/Update
url(r'^dream/(?P<pk>[0-9]+)/$', views.DreamUpdate.as_view(), name='dreams-uptdate'),
# Dreams/detail/detete
url(r'^dream/(?P<pk>[0-9]+)/delete/$', views.DreamDelete.as_view(), name='dreams-delete'),
]
我的 index.html 带有删除按钮:
<!-- linkando css no html -->
{% extends 'base.html' %}
{% block nav %}
<ul>
{% for Dreams in object_list %}
<a href="{% url 'webdeve:detail' Dreams.id %}"><img src={{ Dreams.imagem }}></a>
<li><a href="{% url 'webdeve:detail' Dreams.id %}"> {{ Dreams.titulo }} - {{ Dreams.objetivo }} </a><li>
<!--delete BUTTON-->
<form action="{% url 'webdeve:dreams-delete' Dreams.id %}">
{% csrf_token %}
<input type="hidden" name="dreams_id" value="{{ Dreams.id }}" method="post" style="display: inline" >
<button type="submit" class="btn btn-default btn-sm">
<span class="glyphicon glyphicon-trash"></span>
</button>
</form>
{% endfor %}
</ul>
{% endblock %}
DeleteView
仅在 POST 上删除您的对象,而不是 GET。因此,您需要在表单中使用 method="post"
,因为 GET 会再次呈现此 confirm_delete.html。
<form method="post" action="">
...
</form>
如果您可以通过 GET 进入 DeleteView,action=""
是您 POST 所需要的全部。