Джанго Эвал из базы данных - PullRequest
0 голосов
/ 20 февраля 2019

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

view:

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 БД существует в forms.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 DB colum ...

<!-- _______________________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 DB в виде строки.Например, для первого значения в столбце form (DataConfig()) каждая буква отображается как строка в итерации (сначала отображается «D», затем «a», затем «t» и т. Д. До последнего")").Как я могу сказать Django, что это не строковое значение, а переменная?

1 Ответ

0 голосов
/ 20 февраля 2019

В вашей модели 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 %}

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


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

...