Правильный способ определения начального значения поля формы в Django из базы данных, когда значения базы данных могут меняться
Я пытаюсь создать приложение для сбора отзывов о собеседовании, используя Django. Отзывы о собеседовании следуют шаблону. Шаблон будет меняться со временем. Поэтому каждый раз, когда появляется новый шаблон отзывов о собеседовании, он обновляется в базе данных пользователем-администратором.
Когда интервьюер открывает приложение, он должен видеть последнее значение шаблона, имеющегося в базе данных, как начальное значение формы обратной связи.
В настоящее время я могу предоставить начальное значение поля обратной связи, используя аргумент 'initial' поля обратной связи.
Ниже приведен код:
from django import forms
from .models import R1
from .model_templates import template_R1
from ckeditor.widgets import CKEditorWidget
class R1Form(forms.ModelForm):
interview_date = forms.DateField(widget = DateInput())
feedback = forms.CharField(widget = CKEditorWidget(), initial = template_R1.objects.all().last().template)
class Meta:
model = R1
fields = ['interview_date', 'interviewers', 'comment', 'recommended_level', 'progress']
Проблема этого подхода заключается в том, что при обновлении шаблона поле формы все еще показывает более ранний снимок шаблона, когда был запущен сервер django.
Есть ли другой способ, чтобы поле формы показывало динамические значения, как только шаблон обновляется в базе данных?
Итак, я нашел элегантное решение. Я использовал метод init класса формы для инициализации поля обратной связи:
class R1Form(forms.ModelForm):
def __init__(self, template, *args, **kwargs):
super(R1Form, self).__init__(*args, **kwargs)
self.fields['interview_date'] = forms.DateField(widget=DateInput())
self.fields['feedback'] = forms.CharField(widget=CKEditorWidget(), initial=template)
class Meta:
model = R1
fields = ['interview_date', 'interviewers', 'comment', 'recommended_level', 'progress']
Из представления я использовал метод get_form для передачи шаблона из значений базы данных.
class R1CreateView(LoginRequiredMixin, UserPassesTestMixin, CreateView):
model = R1
template_name = "interviews/r1/create.html"
def get_form(self, form_class=None):
form = R1Form(template=template_R1.objects.all().first().template)
return form