Python Django DeleteView不带slug和via POST
您好,我想删除模型中的一个对象,但我不想在slug中显示id,因此我意识到我可以通过表单中的隐藏标记发送数据,但我没能成功 模板Python Django DeleteView不带slug和via POST,python,django,django-views,Python,Django,Django Views,您好,我想删除模型中的一个对象,但我不想在slug中显示id,因此我意识到我可以通过表单中的隐藏标记发送数据,但我没能成功 模板 <form action="{% url "delete_url" %}" method="post"> {% csrf_token %} <input type="hidden" name="pk" value={{ model.pk }}> <button type="submit">Delete<
<form action="{% url "delete_url" %}" method="post">
{% csrf_token %}
<input type="hidden" name="pk" value={{ model.pk }}>
<button type="submit">Delete</button>
</form>
看法
首先,您的示例代码存在各种需要修复的问题:
隐藏
,而不是隐藏
MyDeleteView
,而不是delete\u视图
DeleteView
使用SingleObjectMixin
来标识对象(请查看此项)。因此,您需要重写SingleObjectMixin
的get_object
方法,以便使用POST
数据而不是slug来检索对象。可能类似的方法应该可以工作(警告:没有错误处理):
类MyDeleteView(DeleteView):
model=ModelName
success\u url=reverse\u lazy(“success\u url”)
def get_对象(self,queryset=None):
pk=self.request.POST['pk']
返回self.get_queryset().filter(pk=pk.get())
对于CBV的温和介绍,我推荐我的CBV指南:多亏了Serafeim,我找到了方法,我必须替换get_object()方法,并从原始方法复制一些代码。我从链接中获取代码: 最后:
class MyDeleteView(DeleteView):
model=ModelName
success_url = reverse_lazy("success_url")
def get_object(self, queryset=None):
pk = self.request.POST['pk']
if queryset is None:
queryset = self.get_queryset()
if pk is not None:
queryset = queryset.filter(pk=pk)
try:
# Get the single item from the filtered queryset
obj = queryset.get()
except queryset.model.DoesNotExist:
raise Http404("No %(verbose_name)s found matching the query" %
{'verbose_name': queryset.model._meta.verbose_name})
return obj
type=“hiden”
这是SO中的拼写错误还是您的项目中的拼写错误?好的,我将编辑。。。我在这里手工编写了所有代码,以放置一个示例代码,它不是我真正的项目代码,无论如何,谢谢,它工作了,但对于您的代码,我得到了一个错误,因此我必须复制原始get_object()方法的部分代码,我将在新的答案中发布代码…是的,我最后忘记了.get()。现在修好了!
class MyDeleteView(DeleteView):
model=ModelName
success_url = reverse_lazy("success_url")
class MyDeleteView(DeleteView):
model=ModelName
success_url = reverse_lazy("success_url")
def get_object(self, queryset=None):
pk = self.request.POST['pk']
return self.get_queryset().filter(pk=pk).get()
class MyDeleteView(DeleteView):
model=ModelName
success_url = reverse_lazy("success_url")
def get_object(self, queryset=None):
pk = self.request.POST['pk']
if queryset is None:
queryset = self.get_queryset()
if pk is not None:
queryset = queryset.filter(pk=pk)
try:
# Get the single item from the filtered queryset
obj = queryset.get()
except queryset.model.DoesNotExist:
raise Http404("No %(verbose_name)s found matching the query" %
{'verbose_name': queryset.model._meta.verbose_name})
return obj