You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用modelformset_factory渲染表单集时本地与服务器显示不一致

Django ModelFormSet 渲染时本地与服务器显示不一致问题

使用modelformset_factory创建表单集并渲染时,本地环境页面渲染正常,HTML符合预期;但服务器端运行相同代码时,会在表单及隐藏的formset management_form前出现一个空列表对象[]。已尝试调整表单集配置、移除初始数据、修改关联queryset等操作,问题仍未解决,寻求技术建议。


相关代码

forms.py

class NewCourseHoleForm(ModelForm):

    class Meta:
        model = CourseHole
        fields = [
            'hole_number',
            'hole_name',
            'par',
            'stroke_index',
            'length',
        ]

    def __init__(self, *args, **kwargs):
        super(NewCourseHoleForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.form_tag = False
        self.helper.form_show_errors = True
        self.helper.form_show_labels = False
        self.helper.form_class = 'form-inline'
        self.helper.use_custom_control = True
        self.helper.layout = Layout(
            Div(
                Div(
                    Div(Field('hole_name', css_class='text-center'), css_class="col-3"),
                    Div(
                        Field('hole_number', css_class='d-none'),
                        css_class="d-none"),
                    Div(Field('length', min=50, max=800), css_class="col-3"),
                    Div(Field('par', min=3, max=5), css_class="col-3"),
                    Div(Field('stroke_index', min=1, max=18), css_class="col-3"),
                    css_class='row',
                ),
                css_class='col-12'
            ),
        )


hole_formset = modelformset_factory(
    CourseHole,
    form=NewCourseHoleForm,
    min_num=18,
    max_num=18,
    # validate_max=True
    # extra=18,
    # can_delete=False,
)

views.py

class CourseDetailView(LoginRequiredMixin, DetailView):
    login_url = '/login/'
    redirect_field_name = 'redirect_to'
    model = Course
    slug_field = 'uuid'
    slug_url_kwarg = 'uuid'
    template_name = 'courses/course_detail.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        course = Course.objects.filter(
            uuid=self.kwargs.get('uuid')).first()
        context['title'] = f'{course.name} - Detail'
        teebox_check = CourseTeeBox.objects.filter(
            course=course).order_by('-course_length')
        context['teeboxes'] = teebox_check
        context['teeboxForm'] = f.NewCourseTeeBoxForm(
            prefix='teebox', course=course)
        holes = [{'hole_number': n, 'hole_name': f'Hole {n}'} for n in range(1,19)]
        context['holes_formset'] = f.hole_formset(
            queryset=CourseHole.objects.none(), prefix='holes', initial=holes)
        return context

    def get_queryset(self):
        queryset = super(CourseDetailView, self).get_queryset()
        return queryset

template.html

<div class="row">
    {{ holes_formset.management_form }}
    {% for form in holes_formset %}
        {% crispy form %}
        {{form.id}}
    {% endfor %}
</div>

排查方向与解决建议

  • 核对依赖版本一致性:确认本地和服务器的Django、django-crispy-forms版本完全一致,版本差异可能导致表单集渲染逻辑出现分歧。
  • 定位空列表来源:在服务器端视图中打印holes_formset的字符串输出,或在模板临时添加{{ holes_formset }}查看完整内容,确认[]是表单集哪个属性的输出。
  • 调整初始数据传递方式:移除实例化表单集时的initial参数,改用表单集的get_initial方法返回初始数据,或通过extra=18替代min_num/max_num配置测试。
  • 清除服务器模板缓存:若服务器启用了模板缓存,先清除缓存后重新渲染页面,排除缓存导致的旧渲染结果问题。
  • 检查模板渲染环境:确认服务器端没有自定义模板标签、过滤器或中间件干扰表单集的渲染流程。

内容的提问来源于stack exchange,提问作者CSL619

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:43:08