Есть ли лучший способ реализовать пользовательские наборы полей в администраторе Django - PullRequest
0 голосов
/ 03 сентября 2018

Мы добавляем настраиваемые наборы файлов в форму администратора для отображения и сохранения видео-кредитов.

здесь мы добавляем наборы файлов.

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

- это имена всех полей, в которые пользователь вводит значение.

пример: enter image description here

вот код для визуализации формы выше:

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 ошибки таймаута при сохранении формы. Есть ли лучший способ реализовать наборы файлов? ИЛИ что-то не так, сохраняя их. Могу ли я что-то там оптимизировать?

...