能否不传递form变量给模板就填充Django FormMixin表单数据?
问题解答
必须传递form变量给模板才能实现FormMixin表单的数据填充,原因如下:
FormMixin的get_initial()方法是用来为表单实例提供初始数据的,但你当前的get方法只是渲染模板,没有创建Form实例也没有将其传入模板。模板里手动编写的表单控件(textarea、radio)和FormMixin的初始化逻辑完全脱节,自然无法获取到get_initial()里设置的值。
修改方案
1. 更新视图类的get方法
创建Form实例并传入模板,get_form()方法会自动调用get_initial()获取初始值:
class CommentEditView(View, FormMixin): form_class = EditCommentForm def get_initial(self): initial = super().get_initial() comment = get_object_or_404(Comment, pk=self.kwargs['comment_id']) # 使用URL传入的comment_id,而非固定值 initial['review_text'] = comment.review_text initial['grade'] = comment.grade return initial def get(self, request, comment_id): form = self.get_form() return render(request, 'catalog/review-edit.html', {'form': form})
2. 修改模板控件绑定初始值
手动编写的表单控件需要从form实例中读取初始值:
- 文本域部分:
<textarea class="product-detail-reviews-textarea" name="review_text" id="id_review_text">{{ form.review_text.value }}</textarea>
- 星级单选框部分,每个选项添加选中判断:
<input type="radio" id="id_grade_five" name="grade" value="5" {% if form.grade.value == 5 %}checked{% endif %}> <label for="id_grade_five" title="Star «5»"></label> <input type="radio" id="id_grade_four" name="grade" value="4" {% if form.grade.value == 4 %}checked{% endif %}> <label for="id_grade_four" title="Star «4»"></label> <input type="radio" id="id_grade_three" name="grade" value="3" {% if form.grade.value == 3 %}checked{% endif %}> <label for="id_grade_three" title="Star «3»"></label> <input type="radio" id="id_grade_two" name="grade" value="2" {% if form.grade.value == 2 %}checked{% endif %}> <label for="id_grade_two" title="Star «2»"></label> <input type="radio" id="id_grade_one" name="grade" value="1" {% if form.grade.value == 1 %}checked{% endif %}> <label for="id_grade_one" title="Star «1»"></label>
补充说明
如果不想传递form变量,你只能单独把初始数据(比如comment对象)传入模板,然后手动绑定值,但这样会丢失FormMixin提供的表单验证、错误信息展示等功能——而你当前模板里已经在使用form.review_text.errors这类表单错误变量,所以必须传入form实例才能正常工作。
内容的提问来源于stack exchange,提问作者user23597190
相关产品推荐
相关产品推荐

