Ошибка типа для удаления файла из базы данных в 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>

Просмотры.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)
)

Модели.ру:

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

Формы.py:

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

URL.py:

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


person Jf2k    schedule 22.03.2015    source источник
comment
Вы пытаетесь вызвать представление удаления без аргумента my_id. Можете ли вы опубликовать соответствующую строку вашего urls.py?   -  person Selcuk    schedule 22.03.2015
comment
@ Сельчук url(r'^delete', views.delete, name="delete"),   -  person Jf2k    schedule 22.03.2015
comment
Вам нужно передать идентификатор методу удаления через ваш URL-адрес. См. stackoverflow.com/questions/19382664/ для примера.   -  person alacy    schedule 22.03.2015
comment
@aus_lacy Удаление объектов с использованием аргумента GET почти всегда является плохой идеей. Метод владельца вопроса здесь более правильный (но немного глючный). См. w3.org/Protocols/rfc2616/rfc2616-sec9.html. #sec9.1   -  person Selcuk    schedule 22.03.2015


Ответы (1)


Вы POST вводите свой идентификатор объекта через форму, в то время как ваше 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 }}" />
person Selcuk    schedule 22.03.2015
comment
Благодарю вас! Теперь я могу перейти к методу удаления! Однако теперь я запускаю Page not found (404) в методе. Почему он не может получить изображение? - person Jf2k; 22.03.2015
comment
извините, забыл отметить @Selcuk. - person Jf2k; 22.03.2015