Очистка CBV - PullRequest
       27

Очистка CBV

0 голосов
/ 28 ноября 2018

У меня есть этот класс, который работает как задумано

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, поэтому мне не нужно определять аргументы дважды, но в настоящее время это конфликтует с именем пользователя.Вот почему я хочу сначала решить проблему с тремя переменными.

1 Ответ

0 голосов
/ 28 ноября 2018

Поскольку это представление имеет две формы, оно не очень подходит для любого общего представления на основе классов.

Представление на основе функций позволит избежать дублирования контекста и будет легко следовать.

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)
...