python - 清理 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)
推荐阅读
- excel - vba如何插入空格删除双线
- kubernetes - 具有自签名证书的 eks 自动扩缩器和港口注册表
- rust - 如何禁用驼峰式警告
- c# - 即使在修改后也无法从 .NET Core 本地服务器提供某些文件扩展名
在 applicationHost.config - r - 带条件的子串 R
- java - if item *in* array java
- php - 为包括未经授权的用户的一组用户实施某种@can
- postgresql - Hibernate - Spring Boot - 将具有外键的对象保存到另一个表
- php - Codeigniter 不选择日期小于 2019 的数据,这些数据具有联接表中的某些类型
- reactjs - Reactjs 中的图像滑块应用程序使用两个子组件