【问题标题】:Django: Issue displaying updates for a MultipleChoiceField, template keeps displaying initial valuesDjango:显示 MultipleChoiceField 更新的问题,模板不断显示初始值
【发布时间】: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


    【解决方案1】:

    当您使用the_obj.values('liquid_choices')[0] 设置它们时,您将初始值设置为the_obj = LiquidAssetModel.objects.all() 返回的任何第一个对象

    【讨论】:

    • 是的。在我的帖子重载中,我删除了存储在 db 中的所有以前的表单,并保存最新的。只对最新形式感兴趣。因此,当访问 get_context_data 并加载 the_obj 时,数据库中只有 1 个对象(最新的),它的值就是我想要显示的值。但是在 html {{ form.liquid_choices|as_crispy_field }} 中,模板中显示的不是我通过 context.update({'form': form}) 保存的。看起来 {{ form.liquid_choices|as_crispy_field }} 显示了存储的第一个表单的 init_values,而不是显示当前表单的值。
    • @Willie 要在创建 from 实例后更改初始值,您需要使用 form.fields["liquid_choices"].initial = the_obj.values('liquid_choices')[0] 试试看。
    • 谢谢,我会的
    • 尝试过 form.fields["liquid_choices"].initial = the_obj.values('liquid_choices')[0], {{ form.liquid_choices|as_crispy_field }} 现在显示没有初始值的字段。在 form.fields["liquid_choices"].initial = the_obj.values('liquid_choices')[0] 之后添加 form.fields["liquid_choices"] = the_obj.values('liquid_choices')[0] 会导致错误“' dict' 对象没有属性 'initial'”。它几乎看起来像一个内存错误
    猜你喜欢
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多