Как ссылаться на класс (имя) модели из 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',
]
<