Обновите поле модели при обнаружении DetailView. [Джанго] - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть DetailView, похожий на views.py :

views.py

class CustomView(DetailView):
    context_object_name = 'content'
    model = models.AppModel
    template_name = 'dynamictemplate.html'

    def get_context_data(self, **kwargs):
        data = super(CustomView, self).get_context_data(**kwargs)
        <...snipped...>
        return data

Как я могу обновить поле модели, IntegerField, когда запрос от urls.py переходит к views.py . Давайте предположим, что имя IntegerField кликов и когда пользователь посещает конкретную ссылку или пассивно, объект модели из базы данных, то как я могу увеличить поле кликов этого объекта на 1 .

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

neverwalkaloner очень близко, но объект должен быть обновлен из базы данных после его сохранения.

from django.db.models import F

def get_context_data(self, **kwargs):
    context = super(CustomView, self).get_context_data(**kwargs)
    self.object.clicks = F('clicks') + 1
    self.object.save()
    self.object.refresh_from_db()
    <...snipped...>
    return context

Теперь будет отображаться значение щелчков вместо __repr__ выражения F.

0 голосов
/ 30 апреля 2018

Вы можете использовать self.object и обновить его следующим образом:

self.object.clicks = self.object.clicks + 1
self.object.save()

Но, как сказал Даниэль в комментарии, используя этот код, вы можете столкнуться с условием гонки . Так что было бы лучше использовать F expressions так:

from django.db.models import F

def get_context_data(self, **kwargs):
    data = super(CustomView, self).get_context_data(**kwargs)
    self.object.clicks = F('clicks') + 1
    self.object.save()
    <...snipped...>
    return data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...