python - 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})
如果我在上下文中摆脱表单,则页面会成功呈现。
有谁知道可能出了什么问题?
解决方案
我建议您检查外键字段(资产和库存项目)中的外来模型实例选择的数量。
如果它们太多,则页面可能需要很长时间才能呈现。
如果是这种情况,解决方案是在HTML的选择字段中实现模型实例的延迟加载。(例如,使用Select2 AJAX 功能)。
推荐阅读
- c - 为什么我的程序没有使用以下凭据打印 empid?
- c++ - 使用布局拆分时 GDB 会缩短函数签名吗?
- python - 加快迭代python
- erlang - Erlang 开端:将函数从 escript 移动到 OTP
- php - PHP-FPM 不管 PHP 错误总是返回 200 响应代码
- google-bigquery - 读取数据时出错,错误信息:CSV 表遇到太多错误,放弃。行数:1280;错误:1
- r - 等高线图添加线
- javascript - 在 componentWillMount 中设置状态时如何解决日志记录问题
- c# - 使用 MySql.Data.EntityFrameworkCore 包进行 TINYINT 或 BIT 类型映射时遇到问题
- python - 想在 html 代码中的特定位置添加一些行