Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django DeleteView不带slug和via POST_Python_Django_Django Views - Fatal编程技术网

Python Django DeleteView不带slug和via POST

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<

您好,我想删除模型中的一个对象,但我不想在slug中显示id,因此我意识到我可以通过表单中的隐藏标记发送数据,但我没能成功

模板

<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