首页 > 解决方案 > 清理 CBV

问题描述

我有这个按预期工作的课程

class UpdateView(TemplateView):

    def get(self, request, username):
        id = User.objects.get(username = username).id
        user = get_object_or_404(User, id = id)
        employee = get_object_or_404(Employee, user_id = id)
        form_user = UserForm(instance=user)
        form_employee = EmployeeForm(instance=employee)
        args = {'form_user': form_user,'form_employee': form_employee, 'username': username}
        return render(request, 'user/update.html', args)

    def post(self, request, username):
        id = User.objects.get(username = username).id
        user = get_object_or_404(User, id = id)
        employee = get_object_or_404(Employee, user_id = id)
        form_user = UserForm(request.POST, instance=user)
        form_employee = EmployeeForm(request.POST, instance=employee)
        if form_user.is_valid() and form_employee.is_valid():
            form_user.save()
            form_employee.save()
            return redirect('user:list')
        args = {'form_user': form_user, 'form_employee': form_employee, 'username': username}
        return render(request, 'user/update.html', args)

我的问题是 get 和 post 方法都使用相同的 id、user 和 employee 变量。我怎样才能清理这个?

我知道我可以创建一个像这样的渲染方法

def render(self, request, username):
    args = {'form_user': form_user, 'form_employee': form_employee, 'username': username}
    return render(request, 'user/update.html', args)

然后打电话

return self.render(request)

在 get 和 post 方法的末尾,所以我也不必定义 args 两次,但目前这与用户名冲突。这就是为什么我想首先解决 3 个变量的问题。

标签: pythondjangomethodsdjango-class-based-views

解决方案


由于此视图有两种形式,因此它不太适合任何基于通用类的视图。

基于函数的视图将避免重复的上下文并且易于理解。

def update_employee(request, username):
    user = get_object_or_404(User, username=username)
    employee = get_object_or_404(Employee, user=user)
    if request.method == 'POST':
        form_user = UserForm(request.POST, instance=user)
        form_employee = EmployeeForm(request.POST, instance=employee)
        if form_user.is_valid() and form_employee.is_valid():
            form_user.save()
            form_employee.save()
            return redirect('user:list')
    else:
        form_user = UserForm(instance=user)
        form_employee = EmployeeForm(instance=employee)

    args = {'form_user': form_user,'form_employee': form_employee, 'username': username}
    return render(request, 'user/update.html', args)

推荐阅读