新用户名被创建而不是被更新

2024-04-19 13:09:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建员工列表。我可以分配用户名,密码和电子邮件给该员工,也可以更新员工信息,我应该能够更新用户名,密码或电子邮件。我可以创建一个员工,也可以创建用户名和密码以及更新员工信息,但当更改用户名或密码或员工的电子邮件时,会创建一个新用户。你知道吗

这是我试过的

class EmployeeForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = models.Employee
        fields = ('name', 'designation', 'section', 'phone_number', 'mobile_number',
                  'email', 'gender', 'role', 'username', 'password', 'avatar',)

def employee(request):
    form = EmployeeForm(request.POST or None)
    if request.method == "POST" and form.is_valid():
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        email = form.cleaned_data['email']
        office_instance = OfficeSetup.objects.get(owner=request.user)
        form = form.save(commit=False)
        form.office = office_instance
        user = User.objects.create_user(
            username=username, password=password, email=email)
        user.save()
        form.save()
        messages.success(request, 'Thank you')
        return redirect('employee-list')
    messages.warning(request, 'Error')
    context = {
        'form': form
    }
    return render(request, 'dashboard/hrm/employee.html', context)

编辑零件

def edit_employee(request, id):
    instance = get_object_or_404(Employee, id=id)
    form = EmployeeForm(request.POST or None, instance=instance)
    if request.method == "POST" and form.is_valid():
        employee = Employee.objects.get(id=id)
        prev_username = employee.username
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        email = form.cleaned_data['email']
        office_instance = OfficeSetup.objects.get(owner=request.user)
        form = form.save(commit=False)
        form.office = office_instance
        # change username or password or email if admin has done the changes in
        # those field
        try:
            user_instance = User.objects.get(username=prev_username)
            user_instance.username = username
            user_instance.set_password(password)
            user_instance.email = email
            form.save()
            user_instance.save()
        except User.DoesNotExist:
            messages.error(request, "Following User Does Not Exist!")
        except:
            user = User.objects.create_user(
                username=username, password=password, email=email)
            form.save()
            user.save()
            messages.success(request, "Thank you")
            return redirect('employee-list')
    messages.warning(request, "Error")
    context = {
        'form': form
    }
    return render(request, 'dashboard/hrm/employee.html', context)

屏幕截图是为了让流程或用例清晰

enter image description hereenter image description here

更新的代码

def edit_employee(request, id):
    instance = get_object_or_404(Employee, id=id)
    form = EmployeeForm(request.POST or None, instance=instance)
    if request.method == "POST" and form.is_valid():
        employee = Employee.objects.get(id=id)
        prev_username = employee.username
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        email = form.cleaned_data['email']
        office_instance = OfficeSetup.objects.get(owner=request.user)
        form = form.save(commit=False)
        form.office = office_instance
        # change username or password or email if admin has done the changes in
        # those field
        user, created = User.objects.get_or_create(username=prev_username)
        if created:
            user.set_password(password)
            user.email = email
            form.save()
            user.save()
            return redirect('employee-list')
        user.set_password(password)
        user.email = email
        form.save()
        user.save()
        return redirect('employee-list')
    messages.warning(request, "Error")
    context = {
        'form': form
    }
    return render(request, 'dashboard/hrm/employee.html', context)

Tags: orinstanceformiddataobjectsemailrequest
1条回答
网友
1楼 · 发布于 2024-04-19 13:09:25

get_or_create方法适用于这样的情况。我会重构来做这样的事情:

user, created = User.objects.get_or_create(username=username)

if created:
    # Fields to only populated on creation
    user.password = password
    ...etc...

# Fields to update on creation or update
user.email = email
...etc...
user.save()

详细信息:https://docs.djangoproject.com/en/1.11/ref/models/querysets/#get-or-create

祝你好运!你知道吗

相关问题 更多 >