Как ссылаться на класс (имя) модели из html-формы в views.py с помощью Django?

Я хочу, чтобы пользователи могли загрузить модель Django, которая отображается в приложении. Типов моделей может быть много, поэтому я хочу обобщить свой код. Сейчас я позволяю пользователям скачивать модель в excel с помощью следующего кода в HTML:

<form id="downloadfile" method="post" action="{% url 'download_file' filename='Irrelevant.xlsx'%}">
    {% csrf_token %}
    <input type="hidden" value="Plant" name="database" />
    <input type="submit" name="downloadfile"  class="btn btn-success" value="Download Plant">
</form>

Мой views.py:

# Define function to download excel file using template
from database.models import Plant

def download_file(request, filename=''):
    if 'downloadfile' in request.POST:
        db_name = request.POST.get('database')
        #How to specify Plant database?
        response = xlsx_generator(Plant, db_name) #db_name is used to name the .xlsx file and is just a string.
        return response

    else:
        #some other things to do for other post requests

Как вы видите, я импортирую модель Plant из database.models и ссылаюсь на нее вручную в xlsx_generator. Я хотел бы сделать ссылку на эту импортированную модель из размещенной формы, чтобы мне больше не приходилось ссылаться на нее вручную. Например. db_model = request.POST.get('database') и затем response = xlsx_generator(db_model, db_name), где db_model ссылается на модель Plant. Можно ли этого добиться? И если да, то как?

from django.conf import settings

def get_all_models():
    model_name_list = []
    installed_apps = settings.INSTALLED_APPS[9:-1]
    # just exclude system app that is not installed by you
    for app in installed_apps:
        app_config = apps.get_app_config(app)
        for model in app_config.get_models():
            model_dict = dict()
            model_dict['name']: model.__name__
            model_dict['value']: model.__name__.lower()
            model_name_list.append(model_dict)
    return model_name_list

Это своего рода динамический способ получить все модели из различных приложений в вашем Django проекте.

Благодаря вкладу @Md.Imam Hossain Roni, у меня теперь есть элегантное решение для получения интересующей модели из скрытого ввода в HTML форме и передачи информации о модели обратно через ответ.

views.py

from django.apps import apps
from django.conf import settings
from database.utils import xlsx_generator
from django.http import HttpResponse

def get_all_models():
    installed_apps = settings.INSTALLED_APPS[6:]
    model_dict={}
    # just exclude system app that is not installed by you
    for app in installed_apps:
        app_config = apps.get_app_config(app)
        for model in app_config.get_models():
            model_dict[model.__name__] = model
    return model_dict

# Define function to download excel file using template
def download_file(request, filename=''):
    if 'downloadfile' in request.POST:
        db_name = request.POST.get('database')
        model_name_list=get_all_models()
        response = xlsx_generator(model_name_list[db_name], db_name)
        return response

Для полноты settings.py:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'users',
    'database',
    'project_management',
]
<
Вернуться на верх