【发布时间】:2021-11-07 13:06:12
【问题描述】:
我创建了一个扩展的用户模型和一个表单来注册它。由于表单由管理员而非用户填写,因此 UserCreationForm 有一个随机密码生成器来填写密码 1 和 2,然后设置新密码。这对新用户来说非常有用,但每次管理员编辑用户配置文件时,都会设置一个新密码。我在这里和大 G 上查看了几十个示例,但似乎找不到可用的解决方案来了解用户是否设置了密码。
我正在将此表单重新用于更新视图,这是我不希望再次生成随机密码的地方。我尝试执行与用户名相同的 if 语句检查,但它的工作方式与 auth\form.py user.set_password 正在寻找密码 1 的方式不同。
class EmployeeRegistrationForm(UserCreationForm):
email = forms.EmailField(required=True, widget=forms.EmailInput(attrs={'class': 'form-control mb-2',
'placeholder': 'Email address'}))
first_name = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control mb-2',
'placeholder': 'First name'}))
last_name = forms.CharField(
widget=forms.TextInput(attrs={'class': 'form-control mb-2', 'placeholder': 'Last name'}))
password1 = None
password2 = None
class Meta:
model = User
fields = ['email', 'first_name', 'last_name']
def clean(self):
password = User.objects.make_random_password(length=10,
allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789')
self.cleaned_data['password1'] = password
self.cleaned_data['password2'] = password
return super().clean()
def save(self, commit=True):
user = super().save(commit=False)
user.email = self.cleaned_data['email']
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
if user.username == '':
if len(user.first_name.split()) and len(user.last_name.split()) > 1:
username = f'{"".join(user.first_name.split()[:2])}{"."}{"".join(user.last_name.split())}'
elif len(user.first_name.split()) > 1:
username = f'{"".join(user.first_name.split()[:2])}{"."}{user.last_name}'
elif len(user.last_name.split()) > 1:
username = f'{user.first_name}{"."}{"".join(user.last_name.split())}'
else:
username = f'{user.first_name}{"."}{user.last_name}'
username = username.lower()
user.username = username
user.set_password(self.cleaned_data['password1'])
if commit:
user.save()
return user
更新
这是 profile_edit 视图,我在其中验证现有用户的详细信息并保存通过表单所做的更改。
@login_required()
def profile_edit(request, slug, *args, **kwargs):
"""
Used for updating the Employee profile
"""
employee = Employee.objects.get(slug=slug)
employee_user = User.objects.get(id=employee.user.id)
form = EmployeeForm(request.POST or None, request.FILES or None, instance=employee)
user_form = EmployeeRegistrationForm(request.POST or None, instance=employee_user)
if 'cancel' in request.POST:
return redirect('corehr:employees')
elif request.method == 'POST':
form = EmployeeForm(request.POST or None, request.FILES or None, instance=employee)
user_form = EmployeeRegistrationForm(request.POST or None, instance=employee_user)
if form.is_valid() and user_form.is_valid():
form.save(commit=False)
user_form.save()
form.save()
messages.success(request, f'{employee.get_full_name}{" was updated successfully."}')
return redirect(reverse_lazy('corehr:profile', kwargs={'slug': slug}))
else:
messages.error(request, 'Please correct the errors listed below')
else:
form = EmployeeForm(request.POST or None, request.FILES or None, instance=employee)
user_form = EmployeeRegistrationForm(request.POST or None, instance=employee_user)
context = {'form': form, 'user_form': user_form}
return render(request, 'coreHR/profile_edit.html', context)
【问题讨论】:
-
你能区分首次用户创建和更新方法吗?
-
这部分我还不知道,我还在学习Django。
-
所以在创建用户时,没有用户 ID 和相关数据,当你更新时,你有一个用户和用户 ID(技术上是一个对象)。更新时,您只更改您想要更改的字段,不一定更改所有数据。
-
是的,我理解那部分。是否可以在 User.objects.password_exists 之类的表单中进行检查?如果是,我应该在哪里插入?
-
当你更新用户信息时,你怎么知道你在和哪个用户打交道?
标签: django django-models django-forms