【问题标题】:Cleaning up CBV清理 CBV
【发布时间】:2018-11-28 13:06:02
【问题描述】:

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

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 个变量的问题。

【问题讨论】:

  • 你为什么要这么做?您甚至没有使用 TemplateView 的任何功能;但实际上您应该使用现有的 UpdateView,它几乎可以为您完成所有这些工作。
  • @DanielRoseman,因为我对 Django 还很陌生,所以我想知道发生了什么,这样我更容易理解。如果 UpdateView 为我做了这一切,我会在某个时候使用它,但在我刚刚开始不明白“这一切”的作用时不会。
  • 了解 Django CBV 的最佳资源是:ccbv.co.uk。把它放在你的书签里,每次你需要的时候再回来;)
  • 好吧,避免重复就像创建一个额外的方法一样简单,您可以从 get()post() 方法调用:例如您可以创建一个get_object(**kwargs) 方法来获取您的用户,基于传递给您的视图的kwargs 和一个返回表单的get_form() 方法和一个get_context_data() 方法来为render 创建kwargs 字典方法。这正是UpdateView 所做的。在您的情况下,您有两个表单和两个对象,所以也许您想将方法更改为 get_objects()get_forms() 并返回字典。
  • @Antwane,我上周偶然发现了那个网站,并且已经收藏并使用了它,但是由于这个问题,我真的不知道我在寻找什么。

标签: python django methods django-class-based-views


【解决方案1】:

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

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

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)

【讨论】:

  • 请注意,前两行是多余的,您从数据库中获取相同的User 两次。最好先获取用户(基于用户名),然后使用它来获取Employee
  • @Alasdair 这不是我的问题,因为我想知道如何避免在 CBV 中出现重复的上下文,因为我正在远离 FBV。您发布的内容几乎与我切换到 CBV 之前的内容完全相同。
  • 您询问了如何清理基于类的视图,但您并没有说必须将其保留为基于类的视图。随意忽略这个答案并坚持基于类的观点,但我认为这个答案是对未来读者的有用提醒,cbvs 并不总是最佳选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 2015-01-16
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多