首页 > 解决方案 > CreateView 的 Django 模型表单渲染时间过长(最终超时)

问题描述

我正在使用 Django 通用类视图(CreateView)和 Django ModelForms。但是由于某种原因,表单渲染似乎卡住了。

这是我的意见.py

class NewExternalWorkOrder(CreateView):
    model = ExternalWorkOrder
    template_name = 'new_external_work_order.html'
    form_class = ExternalWorkOrderForm

我的 ExternalWorkOrder 模型:

class ExternalWorkOrder(models.Model):
    asset = models.ForeignKey(Asset, null=True, blank=True, on_delete=models.DO_NOTHING)
    inventory_item = models.ForeignKey(Item, null=True, blank=True, on_delete=models.DO_NOTHING)
    inventory_item_quantity = models.PositiveIntegerField(validators=[MinValueValidator(1)], null=True, blank=True)
    number = models.CharField(max_length=50, null=True)
    date_created = models.DateTimeField(default=timezone.now)
    nature_of_problem = models.TextField()
    mileage_hours = models.PositiveIntegerField(null=True, blank=True)
    #...more fields...

和我的表单类

class ExternalWorkOrderForm(forms.ModelForm):
    def __init__(self, * args, ** kwargs):
        super(ExternalWorkOrderForm, self).__init__(*args, **kwargs)

    class Meta:
        model = ExternalWorkOrder
        fields = ['asset', 'inventory_item', 'inventory_item_quantity',
              'nature_of_problem', 'mileage_hours']
        widgets = {
            'asset': forms.Select(attrs={'class': 'browser-default'}),
        }

这一切都在几天前工作,但它突然停止工作。该页面现在永远加载,gunicorn worker 几乎总是超时(我将超时增加到 10 分钟以上)。有时它最终会渲染。

我最初以为是表单实例化,但经过几次测试后,实例化似乎完成但表单不会呈现。

我已经更新了我的 views.py 以覆盖 get 方法

    def get(self, request, *args, **kwargs):
        form = self.form_class(initial=self.initial)
        context = {'form': form}
        print("About to render with form...")
        return render(request, self.template_name, {'form': form})

如果我在上下文中摆脱表单,则页面会成功呈现。

有谁知道可能出了什么问题?

标签: pythondjangodjango-forms

解决方案


我建议您检查外键字段(资产库存项目)中的外来模型实例选择的数量。

如果它们太多,则页面可能需要很长时间才能呈现。

如果是这种情况,解决方案是在HTML的选择字段中实现模型实例的延迟加载。(例如,使用Select2 AJAX 功能)。


推荐阅读