Django:提交按钮被触发两次



嗨,我目前正在制作一个表单,用户可以在其中编辑他的个人资料图像。在用户将其个人资料图像更改为新的个人资料图像后,我正在尝试删除用户以前的个人资料图片。到目前为止,我已经完成了脚本,但通过print命令,我发现我的提交按钮(我的脚本(被触发了两次。

一些信息:我使用的是Django 3.1-Python 3.7.2-JS,从CDN 启动

html站点代码

{% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
<div class="media">
<img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
<div class="media-body">
<h2 class="account-heading">{{ user.username }}</h2>
<p class="text-secondary">{{ user.email }}</p>
</div>
</div>
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Informazioni sul profilo</legend>
{{ u_form|crispy }}
{{ p_form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Aggiorna</button>
</div>
</form>
<!--form here-->
</div>
{% endblock content %}

型号.py

from django.db import models
from django.contrib.auth.models import User
from PIL import Image, ImageChops
import os
import time
# Create your models here.
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
image = models.ImageField(default='profile_pics/default.jpg', upload_to='profile_pics')
def __str__(self):
return f'{self.user.username} Profile'
def save(self):
super().save()
#
path = 'media/profile_pics/'
media_pics = os.listdir(path)
img = Image.open(self.image.path)
for imgm in media_pics:
print(imgm)
im2 = Image.open('media/profile_pics/' + imgm)
if list(img.getdata()) == list(im2.getdata()):
print(imgm)
print('Identical')
im2.close()
os.remove('media/profile_pics/' + imgm)
break
else:
print(imgm)
print('Different')
#
if img.height > 300 or img.height > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.image.path)

views.py(此处获取模型.py触发(

from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import UserRegisterForm, UserUpdateForm, ProfileUpdateForm
from django.contrib.auth.decorators import login_required
# Create your views here.
def register(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request, f'Account di {username} è stato creato!')
return redirect('login')
else:
form = UserRegisterForm()
return render(request, 'users/register.html', {'form': form})
@login_required
def profile(request):
if  request.method == 'POST':
u_form = UserUpdateForm(request.POST, instance=request.user)
p_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)
if u_form.is_valid() and p_form.is_valid():
u_form.save()
p_form.save()
messages.success(request, f'Tuo account è stato aggiornato!')
return redirect('profile')
else:
u_form = UserUpdateForm(instance=request.user)
p_form = ProfileUpdateForm(instance=request.user.profile)
context = {
'u_form': u_form,
'p_form': p_form,
}
return render(request, 'users/profile.html', context)

urls.py

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from users import views as user_views
from django.contrib.auth import views as auth_views
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
path('register/', user_views.register, name='register'),
path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name='logout'),
path('profile/', user_views.profile, name='profile'),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
-django_project
--blog (has nothing to do with this scripts up here/)
--django_project
---__init__.py
---asgi.py
---settings.py
---urls.py
---wsgi.py
--media
---profile_pics
----(bunch of player added images)
--static
---CSS
----main.css
----JS (nothing inside)
----Images (nothing inside)
-users
--__pycache__
--migrations
--templates
---users
----profile.html
----register.html
----login.html
----logout.html
--__init__.py
--admin.py
--apps.py
--forms.py
--models.py
--signals.py
--tests.py
--views.py

祝你今天愉快

提交按钮不会触发两次。打印发生在循环媒体图片的代码中-for imgm in media_pics:它将循环与文件夹media/profile_pics中存储的图片一样多的次数。

在调用super().save()之前,您可能需要检查旧图像。您可以通过调用eg-old_profile = Profile.objects.get(pk=self.pk)来获得旧版本,并比较/删除图像(os.remove(old_profile.image.name),然后调用super().save()

最新更新