Моя группа и я пытаемся разработать «очень динамичное» веб-приложение с 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, что это не строковое значение, а переменная?






В вашей модели 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 должен быть файл python, содержащий определение форм. Вы должны импортировать ссылку на этот файл Python в свой код; например, from your_app import formsЯ смог добиться того, что пытался здесь, большое спасибо! Но еще один вопрос. Я пытаюсь заполнить эту форму данными. Я заметил, что в методе в модели я мог бы сделать return form_class(instance=my_instance), и он работает, но проблема в том, что мне нужно вызывать его по сеансовой переменной, а они не разрешены в моделях, а только в взгляды. Как я мог справиться с этим?
form_class(instance=my_instance) — правильный способ получить форму с данными.
Где вы берете экземпляр модели Configuration? Вы, вероятно, получаете это в своем представлении, чтобы передать его в шаблон. В том же представлении вы можете попробовать вызвать метод configuration.get_form() (используя экземпляр из данных сеанса) и передать связанную форму в шаблон.
получение экземпляра в представлении не имело бы для меня никакого смысла в этом случае. Поскольку представление динамически вызывает каждую форму из БД, указание экземпляров для каждой формы в БД не будет динамическим. Мне нужно вызвать его экземпляр напрямую из БД или из формы
Это звучит немного сложно, и мне трудно точно понять ваши потребности. Возможно, создайте новый вопрос (поскольку это кажется другой проблемой, чем этот вопрос) с соответствующими частями вашего кода.
Спасибо за Ваш ответ. Я не понимаю, что я должен поместить в «forms_module», я попытался ввести его форму, но получаю сообщение об ошибке «NameError at /Config/ имя« ConfigUser »не определено» (ConfigUser - это форма)