删除按钮问题'str'对象不是映射



我有一个Imageloader应用程序,每次上传图像时,它都会显示在html页面上,所以我在图像中添加了下载按钮,我也想添加删除按钮,每次按下按钮时,我都试图将删除按钮添加到图像中,即使我不明白这个错误意味着什么,我尝试了很多东西,但都不起作用。下面是我的代码,任何帮助都将不胜感激。

urls.py-主

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

urls.py-应用

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

models.py-更新的

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:WorkDummy-Websitedummy website practicesecond trypractice_2 projectenvlibsite-packagesdjangourlsresolvers.py in resolve, line 556
Python Executable:  D:WorkDummy-Websitedummy website practicesecond trypractice_2 projectenvScriptspython.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

不能对self.image调用delete((方法,因为它不是对象,因此会出现错误。在我看来,你应该使用信号来做到这一点。一旦对象从数据库中删除,你就可以从文件系统中删除实际的文件。

@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)

编辑:

如果您只想删除数据库条目,那么在models.py中删除方法delete的代码,Django提供的delete()方法将完全正常工作。因为如果您只是从数据库中删除对象而不执行任何其他操作,则不需要重写delete方法。

最新更新