Витягаємо список полів з ModleForm в Django

Довелось мені покривати тестами форму в проекті, всі поля в тестах звісно задавались руками і хотілось би якось позбавитись рутинної правки тесту, щоразу коли додаєш звичайне поле. Рішення було знайдено одразу: видрати з ModelForm'и fields і на основі цього списку будувати свій тест, але все виявилось не так просто як здавалось. За замовчуванням отримати список полів з урахуванням виключених і доданих безпосередньо в формі на пряму не можна (читай: я не знайшов як то зробити).

Рішення

В результаті нетривалого дослідження нутрощів ModelForm'и намалювався така собі примітивна функція, яку я залишу на загальний огляд тут в цьому пості. Можливо вона комусь зекономить трохи часу.

def get_all_fields_from_form(instance):
    """"
    Return names of all available fields from given Form instance.

    :arg instance: Form instance
    :returns list of field names
    :rtype: list
    """

    fields = []
    for item in instance.__dict__.items():
        if item[0] == 'declared_fields' or item[0] == 'base_fields':
            for field in item[1]:
                if hasattr(instance.Meta, 'exclude'):
                    if field not in instance.Meta.exclude:
                        fields.append(field)
                else:
                    fields.append(field)
    return fields

Використання

# Створимо модельку для прикладу
class ModelName(models.Model):
    field1 = models.DummyField()
    field2 = models.DummyField()
    field3 = models.DummyField()
    field4 = models.DummyField()


# І форму для неї:
class MyForm(ModelForm):
    class Meta:
       model = ModelName
       exclude = [field1, field2]


# Друкуємо список полів:
print(get_all_fields_from_form(MyForm))

# Вивід:
['field3', 'field4']

P.S

Все таки чомусь мені здається, що я трохи намудрив, можливо ви знаєте кращий метод, напишіть про це в коментарях.

comments powered by Disqus