从 Django 中的数据库中删除文件的类型错误

Typeerror for file deletion from database in django

我正在尝试收集从 django/bootstrap 轮播和数据库中上传和删除照片的代码。但是,我似乎无法克服这个错误:

TypeError at /alzheimers/delete

delete() takes exactly 2 arguments (1 given)

谁能帮帮我?我对 django 有点菜鸟,写这段代码就像拔牙,所以任何帮助将不胜感激。

我的代码: Carousel.html:

{% load staticfiles %}
{% load filename %}

<div class="container">
    <div class="row">
        <div class="col-md-12">
            <div id="myCarousel" class="carousel slide" data-ride="carousel">


                <div class="carousel-inner" role="listbox">
                    {% for document in documents %}
 <div class="item {% if forloop.first %} active {% endif %}"> 
    <div class="row">
      <div class="col">
        <li><a href = "{{document.docfile.url}}">{{document.docfile.name}}</a></li>
        <img src = "{{STATIC_URL}}img/{{document|filename}}" >
<p align="center"><form style="text-align:center" action="{% url 'webportal:delete' %}" method="post" enctype="multipart/form-data">
            {% csrf_token %}
<p>{{ form.non_field_errors }}</p>
            <p>{{ form.Document.label_tag }} {{ form.Document.help_text }}</p>
            <p>
                {{ form.Document.errors }}
                {{ form.Document.docfile }}
            </p> 
            <p><input type="submit" value="Delete" /></p>
        </form></p>
      </div>
    </div>
  </div>
  {% endfor %}
                </div>
                <a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
                    <span class="glyphicon glyphicon-chevron-left"></span>
                    <span class="sr-only">Previous</span>
                </a>
                <a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
                    <span class="glyphicon glyphicon-chevron-right"></span>
                    <span class="sr-only">Next</span>
                </a>
            </div>
            <!-- /.carousel -->
        </div>
    </div>
<form action="{% url 'webportal:carousel' %}" method="post" enctype="multipart/form-data">
            {% csrf_token %}
            <p>{{ form.non_field_errors }}</p>
            <p>{{ form.docfile.label_tag }} {{ form.docfile.help_text }}</p>
            <p>
                {{ form.docfile.errors }}
                {{ form.docfile }}
            </p>
            <p><input type="submit" value="Upload" /></p>
        </form>

</div>

Views.py:

from django.shortcuts import render
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth import authenticate, login
from webportal.views.authentication import LoginForm
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.http import HttpResponse
from django.core.urlresolvers import reverse
from django.conf import settings
from webportal.forms.forms import DocumentForm
from webportal.models import Document, DeleteForm
is_server = True
def delete(request, my_id):
    Deleted=get_object_or_404(Document, docfile=my_id)
    if request.method=='POST':
        form=DeleteForm(request.POST, instance=Deleted)
        if form.is_valid():
            Deleted.delete()
            return HttpResponseRedirect('http://127.0.0.1:8000/alzheimers/')
    else:
        form=DeleteForm(instance=Deleted)
    return render_to_response(
        'webportal/index.html',
        {'documents': documents, 'form': form,},
        context_instance=RequestContext(request)
    )        

            # Redirect to the document list after POST
def carousel(request):
    # Handle file upload
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            newdoc = Document(docfile = request.FILES['docfile'])
            newdoc.save()

            # Redirect to the document list after POST
            return HttpResponseRedirect('http://127.0.0.1:8000/alzheimers/')



else:



 form = DocumentForm() # A empty, unbound form
# Load documents for the list page
documents = Document.objects.all()
#documents=DocumentForm().
# Render list page with the documents and the form
return render_to_response(
    'webportal/index.html',
    {'documents': documents, 'form': form,},
    context_instance=RequestContext(request)
)

Models.py:

class Document(models.Model):
    docfile = models.ImageField(upload_to='webportal/static/img/')
class DeleteForm(ModelForm):
    class Meta:
        model=Document
        fields=[]

Forms.py:

class DocumentForm(forms.Form):
    docfile = forms.ImageField(label='Select a file', help_text='max. 42 megabytes')

urls.py:

url(r'^delete', views.delete, name="delete"),

POST 通过表单输入您的对象 ID,而您的 delete 视图期望它作为参数 (my_id)。将其更改为:

def delete(request):
    if request.method=='POST':
        my_id = request.POST.get('id')
        Deleted=get_object_or_404(Document, id=my_id)
        ...

附带说明一下,Python 约定是对对象使用小写名称。考虑将 Deleted 重命名为 deleted.

更新:您似乎也没有在表单中包含要删除的对象的id。将以下行放在 <form></form> 标签之间:

<input type="hidden" name="id" value="{{ document.id }}" />