Django: получить последние значения объекта базы данных после отправленной формы - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть форма, которая сохраняет три входных значения в базу данных, 1) число, 2) цвет, 3) сделать.После того, как я нажму «отправить», другая подпрограмма должна немедленно отобразить эти значения.

Проблема в том, что я не могу отобразить последние значения, но вместо этого, когда значения были первоначально назначены, они не обновляются и остаются на первомприсвоенные значения.

Пытаясь решить эту проблему, в сообщениях предлагается обновить объект, например Django Получить последнюю запись из базы данных , я создал функцию, которую я вызывал в представлении после нажатия кнопки отправки,но без везения.

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

Возможно, это неправильный способ сделать это, но отражает (возможно, наивную) попытку минимизировать запросы к базе данных, предлагая запросить один объект, а затем разбить этот объект на части и связать его с частями.

Проблема заключается в следующем:

  • Я обновляю все значения в форме и нажимаю «отправить» (что работает) ипоследняя запись теперь находится на вершине базы данных.Я хочу получить этот объект (последние входные значения 'number', 'color' и 'make'. Однако вместо того, чтобы дать мне этот объект, я получаю более ранний объект. Несмотря на попытку "обновить" связанный объект (Product.objects.latest ('id')) он застрял с более ранним вводом (первый ввод).

Вопрос:

  • Как мне сделать, чтобы всегда получать самые последние входные значения, когда я нажимаю кнопку отправки в моей форме (с обновленными значениями)?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

У меня есть форма, которая сохраняет три входных значения в базу данных, 1) число, 2) цвет, 3) сделать.После того как я нажму «отправить», другая подпрограмма должна немедленно отобразить эти значения.

Проблема в том, что я не могу получить последние значения для отображения

Вы делаете это неправильно (и намного сложнее, чем это)должно быть).Правильным решением является явная передача идентификатора продукта в представление «product» (через URL) и загрузка объекта заново в представление (используя yourmodel.objects.get(pk=...)).Если вы используете форму модели для создания своей записи, form.save() возвращает новую запись, поэтому у вас do есть идентификатор на данный момент (и если вы только обновляете существующий продукт, то вы, очевидно, знаетеидентификатор уже).

Вы не опубликовали достаточно кода / информации, чтобы технически объяснить, почему у вас такое поведение, но я сильно подозреваю, что вы используете глобальные переменные (или атрибуты класса), что является наиболее распространенной причинойустаревшие данные в проектах Django.

Кроме того, обратите внимание, что вызов «refresh_from_db ()» для экземпляра модели, который вы только что извлекли из db, в основном бесполезен (шансы, что он обновляется между этими двумя вызовами, довольно мал), и это с учетом того, как ваш (плохо)named) реализована функция «база данных»:

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

завершает выполнение шести ( 6 ) запросов к базе данных.

0 голосов
/ 06 февраля 2019

Хотя предоставленного вами кода недостаточно, я постараюсь помочь и объяснить.

Исходя из моего понимания (никогда не использовал refresh_from_db), вы не можете использовать 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)

Он просто не делает то, что вы думаете.

Предполагается, что ваша кнопка отправки вызывает метод post в относительном представлении класса,или какая-то функция, которая сохраняет эти значения в базе данных (вы также упомянули об этом сами).
В своей функции или классе с обратным представлением вы можете написать запрос, который вы написали в datebase() - Product.objects.latest('id').

Кроме того, вы можете вернутьсяSE с добавленной информацией, такой как это: return reverse('product', kwargs={'lastprod': Product.objects.latest('id')}).

Дайте мне знать, если это не достаточно ясно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...