【发布时间】: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