咨询:基于django-parler的Django多语言项目表单保存优雅实现方式
优化django-parler多语言表单保存的优雅实现
针对你基于《Django 2 by Examples》第10章项目,用django-parler实现多语言支持时,类视图中form_valid方法繁琐的问题,可以通过以下方式简化:
核心优化思路
- 直接复用表单返回的未保存实例,无需手动查询或重新创建对象
- 借助django-parler的语言切换方法,自动关联当前语言的字段保存逻辑
- 通过实例主键是否存在区分新建/更新场景,替代冗余的异常捕获
优化后的代码
from django.utils import translation def form_valid(self, form): current_lang = translation.get_language() # 获取表单绑定的实例(更新场景为数据库已有对象,新建场景为新实例) course = form.save(commit=False) # 新建课程时设置所有者 if not course.pk: course.owner = self.request.user # 设置实例当前语言,确保表单数据保存到对应语言的字段 course.set_current_language(current_lang) course.save() return redirect(reverse('courses:manage_list'))
代码说明
- 复用表单实例:
form.save(commit=False)会返回已填充表单数据的实例,更新场景下直接关联数据库对象,无需额外查询; - 简洁的新建判断:通过
course.pk是否存在判断是否为新建操作,比try-except逻辑更直观; - 自动处理多语言字段:调用
set_current_language后,django-parler会自动将表单数据映射到对应语言的字段,无需手动从cleaned_data逐个赋值。
内容的提问来源于stack exchange,提问作者Matthew Shtyasek
相关产品推荐
相关产品推荐

