在使用 DetailView (Django) 访问之前更新对象
update objects before access using DetailView (Django)
我在 Django 中使用 DetailView。我有一个包含特定时间字段(taxi_time
)的模型,我想比较时间和现在。如果 taxi_time < datetime.now()
,我想将模型中的字段 (taxi_is_closed
) 从 False
更改为 True
。
所以在用户访问post之前,我需要(自动)检查时间并修改taxi_is_closed
。我该怎么做?
我的 View.py
:
@method_decorator(login_required(login_url='/login/'), name='dispatch')
class RecruitView(PermissionRequiredMixin, generic.DetailView):
model = Recruit
template_name = 'taxi/recruit.html'
def has_permission(self):
return self.request.user.profile.email_confirmed
def handle_no_permission(self):
error_message = '아직 인증이 완료되지 않았습니다. 이메일 인증을 완료해주세요! :)'
if self.raise_exception:
raise PermissionDenied(self.get_permission_denied_message())
return render(self.request, 'taxi/info.html', {'error_message': error_message})
def get_context_data(self, **kwargs):
context = super(RecruitView, self).get_context_data(**kwargs)
#pdb.set_trace()
img_var = self.get_object().taxi_popnow*10 + self.get_object().taxi_poptot
img_name = str(img_var)
context['img_name'] = img_name
context['ApplyForm'] = ApplyForm()
return context
我的 model.py
:
class Recruit(models.Model):
taxi_time = models.TimeField('출발 시각')
taxi_is_closed = models.BooleanField('마감', default=False)
def chk_closed(self):
now = datetime.datetime.now()
taxi_datetime = datetime.datetime.combine(self.taxi_date, self.taxi_time)
is_full = self.taxi_poptot <= self.taxi_popnow
is_past = taxi_datetime <= now
if (is_full or is_past):
self.taxi_is_closed = True
else:
self.taxi_is_closed = False
self.save()
我只选择了相关代码。
您可以覆盖 get_object
方法以在 RecruitView
上调用 chk_closed
。
class RecruitView(PermissionRequiredMixin, generic.DetailView):
....
def get_object(queryset=None):
obj = super(RecruitView, self).get_object(queryset=queryset)
obj.chk_closed()
return obj
您可以在 get_context_data
函数中执行此操作:
def get_context_data(self, **kwargs):
context = super(RecruitView, self).get_context_data(**kwargs)
#pdb.set_trace()
img_var = self.get_object().taxi_popnow*10 + self.get_object().taxi_poptot
img_name = str(img_var)
if self.object.taxi_time < datetime.now():
self.object.taxi_is_closed = True
self.object.save()
context['img_name'] = img_name
context['ApplyForm'] = ApplyForm()
return context
我在 Django 中使用 DetailView。我有一个包含特定时间字段(taxi_time
)的模型,我想比较时间和现在。如果 taxi_time < datetime.now()
,我想将模型中的字段 (taxi_is_closed
) 从 False
更改为 True
。
所以在用户访问post之前,我需要(自动)检查时间并修改taxi_is_closed
。我该怎么做?
我的 View.py
:
@method_decorator(login_required(login_url='/login/'), name='dispatch')
class RecruitView(PermissionRequiredMixin, generic.DetailView):
model = Recruit
template_name = 'taxi/recruit.html'
def has_permission(self):
return self.request.user.profile.email_confirmed
def handle_no_permission(self):
error_message = '아직 인증이 완료되지 않았습니다. 이메일 인증을 완료해주세요! :)'
if self.raise_exception:
raise PermissionDenied(self.get_permission_denied_message())
return render(self.request, 'taxi/info.html', {'error_message': error_message})
def get_context_data(self, **kwargs):
context = super(RecruitView, self).get_context_data(**kwargs)
#pdb.set_trace()
img_var = self.get_object().taxi_popnow*10 + self.get_object().taxi_poptot
img_name = str(img_var)
context['img_name'] = img_name
context['ApplyForm'] = ApplyForm()
return context
我的 model.py
:
class Recruit(models.Model):
taxi_time = models.TimeField('출발 시각')
taxi_is_closed = models.BooleanField('마감', default=False)
def chk_closed(self):
now = datetime.datetime.now()
taxi_datetime = datetime.datetime.combine(self.taxi_date, self.taxi_time)
is_full = self.taxi_poptot <= self.taxi_popnow
is_past = taxi_datetime <= now
if (is_full or is_past):
self.taxi_is_closed = True
else:
self.taxi_is_closed = False
self.save()
我只选择了相关代码。
您可以覆盖 get_object
方法以在 RecruitView
上调用 chk_closed
。
class RecruitView(PermissionRequiredMixin, generic.DetailView):
....
def get_object(queryset=None):
obj = super(RecruitView, self).get_object(queryset=queryset)
obj.chk_closed()
return obj
您可以在 get_context_data
函数中执行此操作:
def get_context_data(self, **kwargs):
context = super(RecruitView, self).get_context_data(**kwargs)
#pdb.set_trace()
img_var = self.get_object().taxi_popnow*10 + self.get_object().taxi_poptot
img_name = str(img_var)
if self.object.taxi_time < datetime.now():
self.object.taxi_is_closed = True
self.object.save()
context['img_name'] = img_name
context['ApplyForm'] = ApplyForm()
return context