2017-11-18 66 views
1

我正在尝试创建员工列表。我可以为该员工分配用户名,密码和电子邮件,也可以更新员工信息,以便我可以更新用户名,密码或电子邮件。我可以创建一个员工,并创建用户名和密码以及更新员工信息,但在更改员工的用户名或密码或电子邮件时,会创建一个新用户。创建新用户名而不是更新

这是我曾尝试

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 here enter 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) 

回答

1

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

祝你好运!

+0

有没有必要使用尝试除外? – milan

+0

我不这么认为。 – FlipperPA

+0

我可以在问题中显示更新的代码吗? – milan

相关问题