Django: Проблема с отображением обновлений для поля MultipleChoiceField, шаблон продолжает отображать начальные значения
Первый пост, заранее прошу прощения за ошибки.
Моя проблема: Я инициализирую поля своей модели из собственной базы данных. Эти поля правильно отображаются в моем шаблоне при первом показе (я вижу, что html отражает значения в моей собственной базе данных). Затем я изменяю начальные параметры выбора (для MultiSelectField) в моем шаблоне и сохраняю эти измененные параметры в Django db (проверено, что они сохраняются через функцию администратора) через перегрузку постов в моих представлениях. Мой success_url настроен в urls.py для повторного отображения того же представления. Я перегрузил get_context_data в представлениях для загрузки данных формы из базы данных Django, и для обновления контекстных данных этими загруженными данными, идея в том, что когда шаблоны повторно отображаются (при выборе кнопки submit_button), моя html форма должна теперь отображать данные, загруженные из базы данных Django (а не начальные значения). Но происходит то, что начальные значения отображаются, в отличие от измененных значений, которые я загрузил из базы данных Django. Я был бы очень признателен за помощь в понимании того, почему шаблон отображает значения, отличные от тех, что я загрузил из базы данных Django. Значение формы, которое я обновляю в своем контексте перед тем, как вернуть его в views.py, не является тем, что отображается в шаблоне.
my models.py:
class LiquidAssetModel(models.Model):
#Get my initial values from an external db
unq_assets = Jnance_base_data_main.get_unq_assets()
init_values = Jnance_base_data_main.get_liq_indexes()
liq_dates = Jnance_base_data_main.get_dates()
#initialize my fields
liquid_choices = MultiSelectField(choices = unq_assets, default = init_values)
from_date = models.CharField(max_length=200, choices=liq_dates, default=liq_dates[0][0])
to_date = models.CharField(max_length=200, choices=liq_dates, default=liq_dates[0][0])
def __str__(self):
return self.from_date
Мой froms.py:
class LiquidAssetsForm(forms.ModelForm):
# specify the name of model to use
class Meta:
model = LiquidAssetModel
fields = "__all__"
Моя перегрузка постов из views.py
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
#form = forms.LiquidAssetsForm(request.POST)
#form.is_valid goes to the LiquidAssetsForm class and clean(self) overload to check whether the submitted data is fine
if form.is_valid():
liquid_indexes = form.cleaned_data.get('liquid_choices')
from_index = form.cleaned_data.get('from_date')
to_index = form.cleaned_data.get('to_date')
#cleare the database
all_forms = LiquidAssetModel.objects.all()
all_forms.delete()
form.save(commit=False)
form.save(commit=True)
#save our liquid asset choices to db
Jnance_base_data_main.put_liq(liquid_indexes)
#make sure the db is set up, copy the excel files, and then load them into the db
Jnance_base_data_main.gen_liq_graph(liquid_indexes, int(from_index), int(to_index))
return self.form_valid(form, **kwargs)
else:
return self.form_invalid(form, **kwargs)
моя перегрузка get_context_data из views.py:
class LiquidView(FormView):
template_name = 'liquid_chart.html'
form_class = forms.LiquidAssetsForm
success_url ="/thanksLiquid/"
liq_file_name = ''
def get_context_data(self, **kwargs):
context = super(LiquidView, self).get_context_data(**kwargs)
#build the string to search for a date_NAV file
search_str = settings.STATIC_ROOT + '/Jnance_Mainapp/images/date_liq*'
search_str = search_str.replace('\\', '/')
#search for a file
the_files = glob.glob(search_str)
#split the string and only use the part after 'static/', since we will use the static template tag in the html
if the_files:
#just use the very first file we found in the list
self.liq_file_name = the_files[0].split('static/')[1]
self.liq_file_name = self.liq_file_name.replace('\\', '/')
else:
print("Jnance_Mainapp: views LiquidView no liquid chart found to display")
#update our context with the file name
context.update({'liquid_file_name': self.liq_file_name})
form_class = self.get_form_class()
form = self.get_form(form_class)
the_obj = LiquidAssetModel.objects.all()
if len(the_obj) == 0:
#no forms saved yet
pass
else:
form.liquid_choices = the_obj.values('liquid_choices')[0]
form.from_date = the_obj.values('from_date')[0]
form.to_date = the_obj.values('to_date')[0]
print (form.liquid_choices)
context.update({'form': form})
return context
my urls.py:
urlpatterns = [
path('', views.HomeView.as_view(), name='home'),
path('NAV_Charts/', views.NAVView.as_view(), name='NAV_Charts'),
path('Asset_Charts/', views.AssetView.as_view(), name='Asset_Charts'),
path('Liquid_Charts/', views.LiquidView.as_view(), name='Liquid_Charts'),
path('Sum_Charts/', views.SumView.as_view(), name='Sum_Charts'),
path('Base_Load/', views.BaseLoadView.as_view(), name='Base_Load'),
path('admin/', admin.site.urls, name= 'admin'),
path('thanksNAV/', views.NAVView.as_view()),
path('thanksAsset/', views.AssetView.as_view()),
path('thanksLiquid/', views.LiquidView.as_view()),
path('thanksBaseLoadForm/', views.BaseLoadView.as_view()),
path('Jnance_Mainapp/', include('Jnance_Mainapp.urls', namespace='Jnance_Mainapp')),]
мой шаблон:
{% extends "base.html" %}
{% load static %}
{% load crispy_forms_tags %}
{% block body_block %}
<h1 class="text-center display-1" Bootstrap heading (2.5rem = 40px)>Jnance Liquid Assets Chart Generation</h1>
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<table class="row">
<div class="row">
<div class="col-sm-6 text-center align-left">
<img class="img-fluid mb-1" src="{% static liquid_file_name %}" alt="Unable to load chart!"/>
</div>
<br>
<div class="col-sm-3 text-left align-left">
{{ form.from_date|as_crispy_field }}
<br>
{{ form.to_date|as_crispy_field }}
<br>
<br>
<input name="submit_button" type="submit" value="Generate" id="update_button"
class="btn btn-success" enctype="multipart/form-data">
</div>
<div class="col-sm-3 text-left align-left">
{{ form.liquid_choices|as_crispy_field }}
</div>
</div>
</table>
</form>
{% endblock %}
Вы устанавливаете начальные значения на любой первый объект, который возвращается в the_obj = LiquidAssetModel.objects.all()
, когда вы устанавливаете их с помощью the_obj.values('liquid_choices')[0]