кнопка удаления вопроса 'str' объект не является отображением - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть приложение Imageloader, которое каждый раз загружает изображение, которое будет отображаться на странице html, поэтому я добавил кнопку загрузки к изображениям, и я также хочу добавить кнопку удаления, я пытаюсь добавить кнопку удаления к изображению каждый Когда я нажимаю кнопку, я получаю сообщение об ошибке 'str' объект не является отображением, даже я не понимаю, что означает эта ошибка, я много чего пробовал, но ниже это не сработало - мой код, любая помощь приветствуется.

urls.py -main

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name='home'),
    path('image/', include('imageloader.urls'), 'imageloader'),    
] 

urls.py -app

app_name = 'imageloader'
urlpatterns = [
    path('<int:pk>/', views.delete_pic, name='delete_pic'),
]

models.py -updated

class Imageloader(models.Model):
def validate_file_size(value):
    filesize = value.size

    if filesize > 3000000:
        raise ValidationError(
            "The maximum file size that can be uploaded is 3MB")
    else:
        return value

image = models.ImageField(
    help_text='max size only 3mb ',
    upload_to="imageloader_file/",
    validators=[validate_file_size],
    max_length=120,
    blank=False,
    unique=True,
)

class Meta:
    ordering = ['-id']

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

view.py

def home(request):
    """this function to view the home page """
    template_home = 'index.html'
    img = Imageloader.objects.all()
    if request.method == "POST":
        form = Imageloaderform(request.POST, request.FILES)
        if form.is_valid():
            image = form.cleaned_data.get("image")
            form.save()
            messages.success(request, f'Image uploaded successfully')
            return redirect('home')
        else:
            messages.error(request, f'Pls upload an Image!')
    else:
        form = Imageloaderform()
    return render(request, template_home, {
        'form': form,
        'img': img,
    })

def delete_pic(request, pk):
    if request.method == "POST":
        img = Imageloader.object.get(pk=pk)
        img.delete()
    return redirect('home')

шаблон:

{% for image2 in img %}
        <div class="container">
            <div class="d-flex justify-content-center">
                <img style="height: 300px;" class="mb-3 w-50" src="{{ image2.image.url }}" alt="images!">

            </div>
            <div class="d-flex justify-content-center">
                <a href="{{ image2.image.url }}" download>
                    <button type="button" class="btn btn-outline-primary mb-3">Download</button>
                </a>
                <form method="POST" action="{% url 'imageloader:delete_pic' image2.id %}">
                    {% csrf_token %}
                    <button type="submit" class="btn btn-outline-danger ml-2">Delete</button>
                </form>

            </div>

        </div>
        {% endfor %}

ниже приведено исключение: -обновлено

    TypeError at /image/10/
'str' object is not a mapping
Request Method: POST
Request URL:    http://127.0.0.1:8000/image/10/
Django Version: 3.0.3
Exception Type: TypeError
Exception Value:    
'str' object is not a mapping
Exception Location: D:\Work\Dummy-Website\dummy website practice\second try\practice_2 project\env\lib\site-packages\django\urls\resolvers.py in resolve, line 556
Python Executable:  D:\Work\Dummy-Website\dummy website practice\second try\practice_2 project\env\Scripts\python.exe
Python Version: 3.7.4
Python Path:    
['D:\\Work\\Dummy-Website\\dummy website practice\\second try\\practice_2 '
 'project',
 'D:\\Work\\Dummy-Website\\dummy website practice\\second try\\practice_2 '
 'project\\env\\Scripts\\python37.zip',
 'D:\\Work\\Dummy-Website\\dummy website practice\\second try\\practice_2 '
 'project\\env\\DLLs',
 'D:\\Work\\Dummy-Website\\dummy website practice\\second try\\practice_2 '
 'project\\env\\lib',
 'D:\\Work\\Dummy-Website\\dummy website practice\\second try\\practice_2 '
 'project\\env\\Scripts',
 'c:\\users\\yazan bader\\appdata\\local\\programs\\python\\python37\\Lib',
 'c:\\users\\yazan bader\\appdata\\local\\programs\\python\\python37\\DLLs',
 'D:\\Work\\Dummy-Website\\dummy website practice\\second try\\practice_2 '
 'project\\env',
 'D:\\Work\\Dummy-Website\\dummy website practice\\second try\\practice_2 '
 'project\\env\\lib\\site-packages']
Server time:    Thu, 20 Feb 2020 18:27:55 +0300

1 Ответ

0 голосов
/ 19 февраля 2020

Вы не можете вызвать метод delete () для self.image, так как он не является объектом, поэтому ошибка. На мой взгляд, вы должны использовать сигналы для этого. После удаления объекта из базы данных вы можете удалить сам файл из файловой системы.

@receiver(models.signals.post_delete, sender=Imageloader)
def auto_delete_file_on_delete(sender, instance, **kwargs):
    """
    Deletes file from filesystem
    when corresponding `MediaFile` object is deleted.
    """
    if os.path.isfile(instance.image.path):
        os.remove(instance.image.path)

РЕДАКТИРОВАТЬ:

Если вы просто хотите удалить базу данных затем удалите код для метода delete в вас models.py, и метод delete(), предоставленный Django, будет работать абсолютно нормально. Потому что нет необходимости переопределять метод delete, если вы просто удаляете объект из базы данных и не выполняете никаких других действий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...