【发布时间】:2021-12-24 15:29:55
【问题描述】:
第一次发帖,如有错误请见谅。
我的问题: 我从专有数据库初始化我的模型字段。这些字段在第一次显示时正确显示在我的模板中(我可以看到 html 反映了我专有数据库中的值)。然后我在我的模板中更改初始选择选项(用于 MultiSelectField),并通过我的视图中的后重载将这些更改的选项保存到 Django db(通过管理功能验证其保存)。我的 success_url 在 urls.py 中设置以重新显示相同的视图。我在视图中重载了 get_context_data 以从 Django 数据库中加载表单数据,并使用此加载的数据更新上下文数据,其想法是当模板重新显示时(选择 submit_button 时),我的 html 表单现在应该显示来自数据从 Django 数据库加载(不是初始值)。但是,发生的事情是似乎显示了初始值,而不是我从 Django db 加载的更改值。我非常感谢帮助理解为什么模板显示的值不是我从 Django 数据库加载的值。我在views.py中返回之前在上下文中更新的表单值不是模板中显示的值。
我的模型.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)
views.py 中我的 get_context_data 重载:
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
我的 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 %}
【问题讨论】:
标签: django