Python Django无法删除/清除表单上的数据
我在django应用程序中有一个edit_配置文件视图,它还可以检查用户保存到其配置文件中的pgp密钥是否为RSA格式,不管怎样,如果我第一次添加了一个配置文件头像,它就像一个符咒一样工作,如果我想清除或删除它,我总是跳到execpt块上,用户头像保持不变。 我看不出一个明确的原因,为什么smb可以在这里给我一个提示: 验证器.pyPython Django无法删除/清除表单上的数据,python,django,Python,Django,我在django应用程序中有一个edit_配置文件视图,它还可以检查用户保存到其配置文件中的pgp密钥是否为RSA格式,不管怎样,如果我第一次添加了一个配置文件头像,它就像一个符咒一样工作,如果我想清除或删除它,我总是跳到execpt块上,用户头像保持不变。 我看不出一个明确的原因,为什么smb可以在这里给我一个提示: 验证器.py def default_image_file_extension(value): ext = os.path.splitext(value.name)[1]
def default_image_file_extension(value):
ext = os.path.splitext(value.name)[1] # [0] returns path+filename
valid_extensions = ['.jpg', '.jpeg', '.png']
if not ext.lower() in valid_extensions:
raise ValidationError(u'Unsupported extension. Allowed are are: .jpg, .jpeg, .png')
def default_image_size(value):
limit = 2 * 1024 * 1024
if value.size > limit:
raise ValidationError('File too large. Size should not exceed 2 MiB/MB.')
models.py
def get_file_path(instance, filename):
ext = filename.split('.')[-1]
filename = "%s.%s" % (uuid.uuid4(), ext)
return os.path.join('media', filename)
def get_file_path_user_avatar(instance, filename):
ext = filename.split('.')[-1]
filename = "%s.%s" % (uuid.uuid4(), ext)
return os.path.join('user_avatar', filename)
...
class User(AbstractBaseUser):
user = models.CharField(verbose_name='Username', max_length=20, unique=True)
bio = models.TextField(verbose_name='Bio', blank=True, null=True, max_length=2500)
...
forms.py
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = (
'avatar',
'bio',
)
captcha = CaptchaField()
field_order = ['avatar', 'bio']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['avatar'].label = mark_safe('Avatar:')
self.fields['avatar'].help_text = mark_safe("<h4 class='help_text'>→ Choose a Avatar for your Profile (max. 2 MB)</h4>")
self.fields['bio'].widget.attrs.update({'class': 'class-two-input-fields'})
self.fields['bio'].help_text = mark_safe("<h4 class='help_text'>→ Something about you</h4>")
class用户表单(forms.ModelForm):
类元:
模型=用户
字段=(
"阿凡达",,
"生物",,
)
验证码=验证码字段()
字段顺序=['avatar','bio']
定义初始化(self,*args,**kwargs):
super()
self.fields['avatar'].label=mark_safe('avatar:'))
self.fields['avatar'].help\u text=mark\u safe(“→ 为您的个人资料选择一个头像(最大2 MB)”)
self.fields['bio'].widget.attrs.update({'class':'classtwo输入字段'})
self.fields['bio'].help\u text=mark\u safe(“→ 关于你的事
尝试检测表单错误和异常错误
并且有效吗?保存表单时需要
试试这个
def edit_profile(request):
if request.method == 'POST':
form = UserForm(request.POST, request.FILES, instance=request.user)
try:
pubpgp = request.POST.get('pubpgp')
if not pubpgp or PGPKey.from_blob(pubpgp.rstrip("\r\n"))[0].key_algorithm == PubKeyAlgorithm.RSAEncryptOrSign:
if form.is_valid():
form.save()
messages.success(request, "Profile has been updated successfully.")
return redirect(reverse('home'))
else:
print(form.errors)
return render(request, 'app_Accounts/edit_profile.html', {'form': form})
else:
messages.error(request, "Uuups, something went wrong, please try again.")
return render(request, 'app_Accounts/edit_profile.html', {'form': form})
except Exception as e:
print(e.args)
messages.error(request, "PGP-Key is wrong formated.")
return render(request, 'app_Accounts/edit_profile.html', {'form': form})
else:
form = UserForm(instance=request.user)
args = {'form': form}
return render(request, 'app_Accounts/edit_profile.html', args)
似乎是Django smartfields的一个bug,请参阅:
希望这个问题能尽快解决 是否要从表单中删除配置文件图像?我认为您应该在保存前执行
表单。是否有效()
,如果返回False
,请检查表单。错误
切勿仅使用,除非
您也应该添加异常类型,例如:除了ValidationError:
之外,并分别处理每个已知的异常类型。可选地,在所有这些异常处理之后,您可以添加一个最终的,除了:
对于意外错误,您可以对try
异常
语句进行注释,并显示日志中显示的错误。日志中显示“avatar”属性没有与之关联的文件。在my models.py中,它显示:avatar=fields.ImageField(null=True,blank=True,仍然处于例外块中:(@Venom它在控制台上打印了什么异常?)什么都没有,代码正在运行,但在站点本身,我得到“PGP密钥格式错误。”并且化身保持不变。