【问题标题】:Form receives old data from model表单从模型接收旧数据
【发布时间】:2019-09-26 10:47:33
【问题描述】:

我的表单应该从存储在模型中的最新条目中接收初始值。但是,如果我通过管理面板编辑或删除模型数据,表单中显示的初始数据将保持不变(尽管它在模型中已被删除)。我对自己做错了什么感到困惑。一开始我以为是Chrome保存了旧数据,但是用ctr+shift+r休息后还是一样。

我的forms.py:

from stv.models import BazineKaina,

class DrgSkaiciuokle(forms.Form):
    bazine_kaina = forms.DecimalField(max_digits=5, decimal_places=2, required=True,
                                      label="Įveskite bazinę kainą:",
                                      initial= BazineKaina.objects.latest('data'),
                                      )


    def clean_bazine_kaina(self):
        bazine_kaina = self.cleaned_data['bazine_kaina']
        return bazine_kaina

我的models.py:

class BazineKaina(models.Model):

    bazka = models.DecimalField(max_digits=5, decimal_places=2)

    data = models.DateField(auto_now=False, auto_now_add=True)

    def __str__(self):
        return str(self.bazka)

    class Meta:
        verbose_name_plural = "Bazinė kaina"
        get_latest_by = 'data'

请帮我看看为什么表单仍然收到旧数据?

编辑:我发现,如果我重新启动服务器数据将被刷新,但这不是生产中的解决方案。如何让表单每次调用都获取新数据?

【问题讨论】:

    标签: python django python-3.x django-models django-forms


    【解决方案1】:

    您的DrgSkaiciuokle 在 Django 启动时导入,然后实例化任何 类属性。因此,当您 runserver 或启动您的 Django 工作人员时,对 .latest() 的查询将执行一次,initial 将不再更改。

    在表单的__init__ 方法中设置initial,以便在每次实例化表单时调用它。

    【讨论】:

    • 对于noobish请求我很抱歉,但我对django和python完全陌生,你能提供一个示例代码我应该如何正确地做到这一点?
    【解决方案2】:

    根据 dirkgroten 的建议和 this source 我找到了完整的解决方案:

    forms.py:

    class DrgSkaiciuokle(forms.Form):
    
        bazine_kaina = forms.DecimalField(max_digits=5, decimal_places=2, required=True,
                                          label="Įveskite bazinę kainą:",
                                          help_text="Įprastiniams skaičiavimams naudokite einamųjų metų bazinę kainą",
                                          error_messages={'max_digits': 'Bazinė kaina neturi viršyti 5 skaitmenų.'},
                                          )
    
        def __init__(self, *args, **kwargs):
            initial_arguments = kwargs.get('initial', None)
            updated_initial = {}
            updated_initial['bazine_kaina'] = BazineKaina.objects.latest('data')
            kwargs.update(initial=updated_initial)
            super(DrgSkaiciuokle, self).__init__(*args, **kwargs)
    
    
        def clean_bazine_kaina(self):
            bazine_kaina = self.cleaned_data['bazine_kaina']
            return bazine_kaina
    

    【讨论】:

    • 您没有使用initial_arguments,因此可以删除该行。虽然,我认为您应该检查是否设置了initial_arguments,并且只有在没有设置的情况下,才设置bazine_kaina 的初始值。这样一来,您的表单就会像使用它的人所期望的那样运行(如果以后有人必须使用您的代码)。
    猜你喜欢
    • 1970-01-01
    • 2018-10-23
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2019-01-14
    相关资源
    最近更新 更多