Джанго Эвал из базы данных

Моя группа и я пытаемся разработать «очень динамичное» веб-приложение с Django. У нас есть шаблон «конфигурации» для пользователей, где каждый может настроить свое собственное пространство. Каждый параметр конфигурации должен быть прочитан из БД.

Посмотреть:

def config(request):
    if 'logged' not in request.session:
        return redirect(login)
    apps_list = App.objects.all()
    varS = varsesion(request)
    context = Configurations.objects.all()
    for row in context:
        row.form = eval(row.form) #Not sure at all if this is ok
        print (row.form)

    context.App = 'config'
    return render(request, "index.html", {'context': context, 'apps_list ': apps_list , 'varS': varS,
                                           'context.App': context.App})

И в нашей БД у нас есть таблица моделей Configurations, подобная этой:

+----+-----+-----+-----+---------+---------------+
| id |user |Title|Body |OptionBtn|     form      |
+----+-----+-----+-----+---------+---------------+
| N  |userA|  X  |  X  |    X    | DataConfig()  |
+----+-----+-----+-----+---------+---------------+
| N2 |userA|  X  |  X  |    X    | ColorsConfig()|
+----+-----+-----+-----+---------+---------------+
| N3 |userA|  X  |  X  |    X    |ButtonsConfig()|
+----+-----+-----+-----+---------+---------------+

И многие другие столбцы, которые я пропущу...

Конечно, каждое значение Form в поле form БД существует в form.py с соответствующими именами. Проблема возникает, когда я пытаюсь использовать повторять эти поля форм в нашем шаблоне (каждый другой столбец из БД отображается правильно, например, кнопки, заголовки, тексты и т. д.)

Вот шаблон (я пропустил некоторые атрибуты в таблице примеров):

<div class = "breadcrumb">
    <li class = "breadcrumb-item">
        <a href = "/config.html"><h1 style = "color:#871830">Configurations panel</h1></a>
    </li>
</div>
{% for configuration in context %}
<div style = "" id = "panel{{ configuration.codConfi }}" class = "breadcrumb form-inline">
    <div class = "form-group col-12" style = "color:#228718"><h3>{{ configuration.title}}</h3></div>
        <div class = "form-group col-3 m-1">
            <label class = "form-group">{{ configuration.body }}</label>
        </div>
    <button id = "btn{{ configuration.codConfi }}" type = "submit" class = "btn btn-info ml-auto mr-0 mr-md-3 my-2 my-md-4">{{ configuration.OptionBtn }}</button>
</div>

Все это отображается корректно и идеально. Но когда дело доходит до столбца form БД...

<!-- _______________________Forms iterations__________________________ -->
<form style = "display:none" id = "frm{{ configuration.codConfi }}" class = "breadcrumb form-inline" action = "/Config/{{ configuration.codConfi }}" method = "POST" enctype = "application/x-www-form-urlencoded">{% csrf_token %}
    <div class = "form-group col-12" style = "color:#228718"><h3>Configure {{ configuration.Title }}</h3></div>
        {% for field in configuration.form %}
            <div class = "form-group col-3 m-1">
                <label class = "form-group">{{ field.label }}: </label>
                {{ field }}
            </div>
        {% endfor %}
    <button type = "submit" class = "btn btn-success ml-auto mr-0 mr-md-3 my-2 my-md-4">Apply changes</button>
</form>
{% endfor %}

(Если вы видите некоторые атрибуты, которые не показаны в моей таблице примеров, это просто потому, что я не набрал их все).

Вместо того, чтобы правильно отображать фактические формы, он отображает значение столбца form БД в виде строки. Например, для первого значения в столбце form (DataConfig()) он отображает каждую букву в виде строки в итерации (сначала отображается «D», затем «a», затем «t» и т. д. до последнего «)») . Как я могу сказать Django, что это не строковое значение, а переменная?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
280
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашей модели Django Configuration вы можете добавить свойство, которое извлекает и создает экземпляр фактического класса формы.

Например:

class Configuration(models.Model):
    ...

    def get_form(self):
        # 'forms_module' is the Python module (file) that holds the form classes
        # 'self.form' is a string that holds the name of the form class
        form_class = getattr(forms_module, self.form)

        # create an (un-bound) instance of the form
        return form_class()

Затем в вашем шаблоне (при условии, что configuration является экземпляром модели Configuration) вы можете изменить эту строку:

{% for field in configuration.form %}

в это

{% for field in configuration.get_form %}

Примечание: чтобы это работало, вам нужно будет сохранить имя класса формы без скобок в поле БД (или удалить скобки перед вызовом getattr(forms_module, self.form)).


Если вам нужно что-то более конкретное, вам нужно будет добавить дополнительную информацию к вашему вопросу.

Спасибо за Ваш ответ. Я не понимаю, что я должен поместить в «forms_module», я попытался ввести его форму, но получаю сообщение об ошибке «NameError at /Config/ имя« ConfigUser »не определено» (ConfigUser - это форма)

Gonzalo Dambra 20.02.2019 21:25
forms_module должен быть файл python, содержащий определение форм. Вы должны импортировать ссылку на этот файл Python в свой код; например, from your_app import forms
Ralf 20.02.2019 21:29

Я смог добиться того, что пытался здесь, большое спасибо! Но еще один вопрос. Я пытаюсь заполнить эту форму данными. Я заметил, что в методе в модели я мог бы сделать return form_class(instance=my_instance), и он работает, но проблема в том, что мне нужно вызывать его по сеансовой переменной, а они не разрешены в моделях, а только в взгляды. Как я мог справиться с этим?

Gonzalo Dambra 20.02.2019 23:54
form_class(instance=my_instance) — правильный способ получить форму с данными.
Ralf 21.02.2019 00:06

Где вы берете экземпляр модели Configuration? Вы, вероятно, получаете это в своем представлении, чтобы передать его в шаблон. В том же представлении вы можете попробовать вызвать метод configuration.get_form() (используя экземпляр из данных сеанса) и передать связанную форму в шаблон.

Ralf 21.02.2019 00:07

получение экземпляра в представлении не имело бы для меня никакого смысла в этом случае. Поскольку представление динамически вызывает каждую форму из БД, указание экземпляров для каждой формы в БД не будет динамическим. Мне нужно вызвать его экземпляр напрямую из БД или из формы

Gonzalo Dambra 21.02.2019 12:41

Это звучит немного сложно, и мне трудно точно понять ваши потребности. Возможно, создайте новый вопрос (поскольку это кажется другой проблемой, чем этот вопрос) с соответствующими частями вашего кода.

Ralf 21.02.2019 14:17

Другие вопросы по теме