Мы добавляем настраиваемые наборы файлов в форму администратора для отображения и сохранения видео-кредитов.
здесь мы добавляем наборы файлов.
def get_fieldsets(self, request, obj=None):
fieldsets = super(CreditsAdminMixin, self).get_fieldsets(request, obj=None)
for category in CreditCategory.objects.all().order_by('name'):
fields = []
for field in category.fields.all().order_by('name'):
field_name = "credit_%s_%s" % (slugify(category.name), slugify(field.name))
fields.append(field_name)
self.exclude += (field_name, )
fieldsets.append((category.name, {'fields': fields}))
return fieldsets
CreditCategory
- категория для каждого кредита.
feilds
- это имена всех полей, в которые пользователь вводит значение.
пример:
вот код для визуализации формы выше:
def __init__(self, *args, **kwargs):
super(CreditsFormMixin, self).__init__(*args, **kwargs)
self.helper_credits = FormHelper()
self.helper_credits.form_tag = False
fieldsets = []
for category in CreditCategory.objects.all():
fields = []
for field in category.fields.all():
field_name = "credit_%s_%s" % (slugify(category.name), slugify(field.name))
self.credits_keys.append({"key":field_name,"value":field})
initial = None
if self.instance.pk:
try:
initial = str(self.instance.credits.get(field=field))
except Credit.DoesNotExist:
pass
except Credit.MultipleObjectsReturned:
pass
self.fields[field_name] = forms.CharField(label=field.name, initial=initial,max_length=255,
required=False, validators=[validate_credit_field])
fields.append(Field(field_name))
fieldsets.append(CollapsibleFieldset(category.name, ColumnFields(*fields)))
self.helper_credits.layout = Layout(*fieldsets)
А вот где мы сохраняем кредиты:
def save_credits(self):
instance = self.instance
for field in CreditField.objects.all():
name = self.cleaned_data["credit_%s_%s" % (slugify(field.category.name), slugify(field.name))]
if name:
credit = instance.credits.filter(field=field).first()
if credit:
credit.name = name
credit.save()
else:
credit = instance.credits.create(field=field, name=name)
else:
instance.credits.filter(field=field).delete()
Это прекрасно работает, вплоть до нескольких недель назад. Но теперь, когда кредитные поля для каждого увеличения постепенно увеличиваются, мы получаем 502 ошибки таймаута при сохранении формы. Есть ли лучший способ реализовать наборы файлов? ИЛИ что-то не так, сохраняя их. Могу ли я что-то там оптимизировать?