簡體   English   中英

清理CBV

[英]Cleaning up 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個變量解決問題。

由於此視圖有兩種形式,因此它不適用於任何基於通用類的視圖。

基於功能的視圖將避免重復的上下文,並且易於遵循。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM