社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

Django:在提交表单后获取最新的数据库对象值

Jaco • 6 年前 • 2280 次点击  

我有一个表单,它将三个输入值保存到一个数据库,1)数字,2)颜色,3)品牌。 在我按下“提交”之后,另一个例程应该立即显示这些值。

问题是,我无法显示最新的值,但是,一旦这些值被最初分配,它们就不会更新并坚持第一个分配的值。

为了解决这个问题,posts建议更新这个对象,比如 Django Get Latest Entry from Database ,我创建了一个函数,在按下submit之后,我在view中调用了它,但是没有运气。

from django.forms import ModelForm
from django.views.generic import FormView
from django.urls import path, include
from django.urls import reverse


class Product(models.Model):
    number = models.CharField(max_length=10)
    color = models.CharField(max_length=10)
    make = models.CharField(max_length=10)

    objects = models.Manager()

class ProductModelForm(ModelForm):
    class Meta:
        model = Product
        fields = ('__all__')


def database():
    dbo = Product.objects.latest('id')
    dbo.refresh_from_db()
    return dbo


class ProductFormView(FormView):
    form_class = ProductModelForm
    template_name = 'form/test_form.html'

    def form_valid(self, form):
        form.save()
        return super().form_valid(form)

    def get_success_url(self):
        database()
        print(Product.objects.latest('id'))  # just as a test
        return reverse('product')



urlpatterns = [
    path('', ProductFormView.as_view(), name='product'),
]

# <!DOCTYPE html>
# <html lang="en">
# <head>
#     <meta charset="UTF-8">
#     <title>Title</title>
# </head>
# <body>
# <form method="post" >
#     {% csrf_token %}
#     {{form}}
#     <button type="submit" class="btn btn-default">Submit</button>
# </form>
# </body>
# </html>

我有一个简单的例程(db_connector.py)我在数据库对象和变量之间创建一个链接,例如(没有任何函数或类):

number = database().number
color = database().color
make = database().make

这可能是错误的做法,但反映了(可能是天真的)试图最小化数据库请求的想法,即请求一个对象,然后将该对象拆分为多个部分并链接到各个部分。

问题是:

  • 我更新表单中的所有值,然后按submit(这有效),这个最新的条目现在位于数据库的“顶部”。我要检索此对象(“number”、“color”和“make”的最新输入值)。但是,我得到的不是这个对象,而是一个更早的对象。尽管尝试“刷新”链接对象(Product.objects.latest('id')),但它仍然停留在较早的输入(第一个输入)上。

问题是:

  • 我应该怎么做,总是得到最新的输入值,一旦我按提交在我的表单上(与更新的值)?
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49928
文章 [ 2 ]  |  最新文章 6 年前
BoobyTrap
Reply   •   1 楼
BoobyTrap    7 年前

虽然您提供的代码在imo中还不够,但我会尽力提供帮助和解释。

根据我的理解(从未使用过 refresh_from_db ),您不能使用 从数据库刷新 这种方式。

在你的 database() 函数获取最后一个条目并尝试刷新其信息,但在获取后未对其进行更改,使其成为无意义的行(它不刷新查询,但结果返回实例)。

refresh_from_db() 如果在从数据库获取和使用特定实例信息之间对其进行了更改,则更新该信息。

docs :

def test_update_result(self):
    obj = MyModel.objects.create(val=1)
    MyModel.objects.filter(pk=obj.pk).update(val=F('val') + 1)
    # At this point obj.val is still 1, but the value in the database
    # was updated to 2. The object's updated value needs to be reloaded
    # from the database.
    obj.refresh_from_db()
    self.assertEqual(obj.val, 2)

它根本不像你想象的那样。

您的submit按钮应该调用相对类视图中的post方法,或者一些将这些值保存到数据库中的函数(您自己也提到过)。
在反向视图函数或类中,可以编写在中编写的查询 datebase() - Product.objects.latest('id') .

此外,还可以使用添加的信息(例如: return reverse('product', kwargs={'lastprod': Product.objects.latest('id')}) .

如果还不够清楚,请告诉我。

bruno desthuilliers
Reply   •   2 楼
bruno desthuilliers    7 年前

我有一个表单,它将三个输入值保存到一个数据库,1)数字, 2)颜色,3)品牌。在我按下“提交”之后,另一个程序应该 立即显示这些值。

问题是我无法获取要显示的最新值

你做错了(而且要复杂得多)。正确的解决方案是明确地将产品id传递到“产品”视图(通过url),并在视图中重新加载对象(使用 yourmodel.objects.get(pk=...) ). 如果使用模型表单创建记录, form.save() 返回新记录,以便 在这一点上有ID(如果你只更新一个现有的产品,那么你显然已经知道了ID)。

您没有发布足够的代码/信息来从技术上解释为什么会出现这种行为,但我强烈怀疑您使用的是全局变量(或类属性),这是Django项目中导致数据陈旧的最常见原因。

另外,请注意,在刚从db获取的模型实例上调用“refresh_from_db()”主要是无用的(在这两个调用之间更新它的可能性很小),并且考虑到您的(名称不正确的)“database”函数是如何实现的,这:

number = database().number
color = database().color
make = database().make

最终 ( )对数据库的查询。