我有一个类似于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
的请求转移到views.py时,如何更新模型字段,即views.py。假设IntegerField的名称是单击,当用户访问特定链接或被动访问数据库中的模型对象时,我如何将该对象的单击字段增加1。
发布于 2018-04-30 00:19:22
您可以使用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
发布于 2019-05-20 19:23:52
“永不漫游”非常接近,但是保存后需要从数据库中刷新对象。
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
现在将显示单击的值,而不是F表达式的__repr__
。
https://stackoverflow.com/questions/50096510
复制相似问题