首页 > 解决方案 > Django:提交表单后获取最新的数据库对象值

问题描述

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

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

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

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

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

问题是:

问题是:

标签: djangodjango-modelsdjango-forms

解决方案


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

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

在您的database()函数中,您获得了最后一个条目并尝试刷新其信息,尽管自获得它以来您没有更改它,使其成为毫无意义的行(它不会刷新查询,但实例会作为结果返回)。

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

根据文档中的示例:

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)

它根本不做你认为它做的事情。

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

此外,您可以使用以下附加信息进行反转:return reverse('product', kwargs={'lastprod': Product.objects.latest('id')}).

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


推荐阅读