【问题标题】:Permission Error while deleting a django file删除 django 文件时出现权限错误
【发布时间】:2020-06-07 21:22:52
【问题描述】:

我正在尝试添加一个删除文件(视频)的视图,但我的表单似乎有问题,因为我收到了 ValueError("The view startup_home.views.delete_video 没有返回 HttpResponse 对象。它返回 None 而不是")。

views.py

    def delete_video(request, video_id):
              delete_v = get_object_or_404(Post, id=video_id)
              delete_v.delete()
              return HttpResponseRedirect('/')

models.py

    class Post(models.Model):
        text = models.CharField(max_length=200)
        video = models.FileField(upload_to='clips', null=True, blank=True)
        user = models.ForeignKey(User, related_name='imageuser', on_delete=models.CASCADE, default='username')

        def __str__(self):
            return str(self.text)

    @receiver(models.signals.post_delete, sender=Post)
       def auto_delete_file_on_delete(sender, instance, **kwargs):
       if instance.video:
           if os.path.isfile(instance.video.path):
               os.remove(instance.video.path)

urls.py

    urlpatterns = [
        path('', views.home, name='home'),
        path('upload', views.upload, name='upload'),
        path('video/<int:video_id>/', views.delete_video, name='delete_video'),
    ]

home.html

    {% if content.video %}
        <div class="float-right">
            <form action="video/{{ content.id }}" action="post">
                <button type="submit">Delete</button>
            </form>
        </div>
    {% endif %}

【问题讨论】:

  • 如果form.is_valid() 是False 怎么办?
  • @WillemVanOnsem 如果 form.is_valid() 为 False,则返回与问题描述相同的 ValueError。我只是向左移动了 4 个空格,因为这样它不会返回任何错误,但仍然不会删除文件
  • 正是我的意思,在这种情况下你也需要返回一些东西,例如再次渲染页面(你可以看到print(form.errors)的错误)。
  • @WillemVanOnsem 所以 else 应该回到原来的位置 print(form.errors) 对吧?
  • @WillemVanOnsem 我刚刚编辑了我的views.py,但它没有显示错误

标签: python django django-models django-forms django-views


【解决方案1】:

你的表单代码有错别字第一个方法是POST

#In Template
<form action="{% url 'appName:viewName' content.pk %}" method="post">
   ....
</form>

像这样写appName:viewName的地方是个很好的练习方式

# In urls.py
app_name = 'appName'
urlpatterns = [
    path('video/<int:pk>/', views.delete_video, name='viewName'),
]

【讨论】:

  • 现在我收到了NoReverseMatch at / 'startup_home' is not a registered namespace。顺便说一句,startup_home 是应用程序名,在主 urls.py 上,应用程序名由 path('', include('startup_home.urls')), 调用。
  • 为什么你不使用 method="post" 而不是 action="post"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 2013-07-04
  • 2013-05-04
  • 1970-01-01
  • 2023-01-11
相关资源
最近更新 更多