【问题标题】:Django model form render for CreateView takes too long (eventually times out)CreateView 的 Django 模型表单渲染时间过长(最终超时)
【发布时间】:2021-03-21 14:38:09
【问题描述】:

我正在使用 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})

如果我去掉上下文中的表单,页面就会成功呈现。

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

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    我建议您检查外键字段(assetinventory_item)中选择的外部模型实例的数量。

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

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

    【讨论】:

    • 这解决了我遇到的问题。我有数以千计的资产项目。我试图限制 ModelForm 中的查询集,但是虽然这已经使页面呈现,但我收到一个错误,即在提交(保存)时过滤器无法在切片查询集上使用。使用 django-select2 的 ModelSelect2Widget 解决了这个问题,尽管保存表单需要太长时间。谢谢。
    猜你喜欢
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2015-08-19
    • 2013-10-10
    • 2019-08-16
    • 2016-04-11
    • 1970-01-01
    相关资源
    最近更新 更多