views.edit_profile 不返回字段错误,而是返回网页错误。
在 views.registration 中 - 它确实返回字段错误,但在 views.edit_profile 而不是字段错误中,它返回网页错误。当两者具有相似的代码时会发生什么? 下图是views.register提交后的错误。
views.register 字段错误:
这是来自 views.edit_profile 的错误。由于手机无效而导致错误。错误应该与views.register 相同。 views.edit_profile 字段错误:
models.py
CustomUser 模型:我在这里设置验证并制作表格。
class CustomUser(AbstractBaseUser, PermissionsMixin):
username = models.CharField(
_('Username'),
max_length=150,
unique=True,
help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
validators=[UnicodeUsernameValidator()],
error_messages={
'unique': _("A user with that username already exists."),
},
)
email = models.EmailField(_('Email Address'), unique=True)
palotype = models.CharField(_('Type'), max_length=150, choices=TYPE_CHOICES, default='Palon-on')
suffix = models.CharField(_('Suffix'), max_length=150, blank=True)
first_name = models.CharField(_('First Name'), validators=[AlphaSpaces()], max_length=150, blank=False)
middle_name = models.CharField(_('Middle Name'), validators=[AlphaSpaces()], max_length=150, blank=True)
last_name = models.CharField(_('Last Name'), validators=[AlphaSpaces()], max_length=150, blank=False)
birth_date = models.CharField(_('Birth Date'), validators=[BirthdateRegex()], max_length=10, blank=False)
region = models.CharField(_('Region'), validators=[AlphaSpaces()], max_length=150, blank=False)
city = models.CharField(_('City'), validators=[AlphaSpaces()], max_length=150, blank=False)
barangay = models.CharField(_('Barangay'), max_length=150, blank=False)
unitno = models.CharField(_('Unit / Apartment No.'), max_length=150, blank=True)
floorno = models.CharField(_('Floor'), max_length=150, blank=True)
bldgname = models.CharField(_('Building Name'), max_length=150, blank=True)
housebldgno = models.CharField(_('House/Building No.'), max_length=150, blank=True)
streetname = models.CharField(_('Street Name'), max_length=150, blank=True)
villagedistrict = models.CharField(_('Village / District'), max_length=150, blank=True)
mobileno = models.CharField(_('Mobile Number'), validators=[PhoneRegex()], max_length=150, blank=False)
landline = models.CharField(_('Landline'), validators=[LandlineRegex()], max_length=150, blank=True)
qr_code = models.ImageField(upload_to='qr_codes', blank=True)
start_date = models.DateTimeField(default=timezone.now)
about = models.TextField(_(
'about'), max_length=500, blank=True)
is_staff = models.BooleanField(default=True)
is_active = models.BooleanField(default=True)
objects = CustomAccountManager()
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email', 'first_name', 'last_name', 'birth_date', 'region', 'city', 'barangay', 'mobileno']
def __str__(self):
return self.username
def save(self, *args, **kwargs):
qrcode_img = qrcode.make(self.username)
canvas = Image.new('RGB', (290, 290), 'white')
canvas.paste(qrcode_img)
fname = f'qr_code-{self.username}.png'
buffer = BytesIO()
canvas.save(buffer,'PNG')
self.qr_code.save(fname, File(buffer), save=False)
canvas.close()
# if len(str(self.birth_date))<10:
# raise ValueError(('Birthdate cannot less than 10 characters.'))
# elif self.birth_date > datetime.date.today().strftime("%m/%d/%Y"):
# raise ValueError(('Birthdate cannot be set as future date.'))
# elif self.birth_date == datetime.date.today().strftime("%m/%d/%Y"):
# raise ValueError(('Birthdate cannot be set equal to todays date.'))
super().save(*args, **kwargs)
用户注册表:
class UserRegisterForm(UserCreationForm):
email = forms.EmailField()
class Meta:
model = CustomUser
fields = ['username', 'email', 'password1', 'password2', 'palotype', 'suffix','first_name',
'middle_name', 'last_name', 'birth_date','region','city','barangay','unitno','floorno','bldgname',
'housebldgno','streetname','villagedistrict','mobileno','landline']
forms.py
UserEdit 表单 - 我删除了密码。
class UserEditForm(UserChangeForm):
email = forms.EmailField()
class Meta:
model = CustomUser
fields = ['username', 'email', 'palotype', 'suffix','first_name',
'middle_name', 'last_name', 'birth_date','region','city','barangay','unitno','floorno','bldgname',
'housebldgno','streetname','villagedistrict','mobileno','landline']
views.py
def register(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password1')
new_user = authenticate(username=username, password=password)
login(request, new_user)
return redirect('home')
else:
form = UserRegisterForm()
return render(request, 'register.html', {'form': form})
def edit_profile(request):
if request.method == 'POST':
form = UserEditForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
messages.info(request, 'Information successfully updated!')
return redirect('home')
else:
form = UserEditForm(instance=request.user)
args = {'form': form}
return render(request, 'change-info.html', args)
注意:我尝试在 edit_profile 中使用 UserRegisterForm 作为表单,但遇到了同样的错误。
我设法通过此代码修复了错误。
def edit_profile(request):
if request.method == 'POST':
form = UserEditForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
# username = form.cleaned_data.get('username')
# password = form.cleaned_data.get('password1')
# user = authenticate(username=username, password=password)
# login(request, user)
messages.info(request, 'Information successfully updated!')
return redirect('home')
else:
messages.info(request, form.errors)
form = UserEditForm(instance=request.user)
args = {'form': form}
return render(request, 'change-info.html', args)
else:
form = UserEditForm(instance=request.user)
args = {'form': form}
return render(request, 'change-info.html', args)
固定结果:
但它与 views.register 有很大不同。 我希望错误与 views.register 相同。