使用DetailView(Django)访问之前更新对象

问题描述 投票:0回答:2

我在Django中使用DetailView。我有一个模型,包括一定的时间字段(taxi_time),我想比较时间和现在。如果taxi_time < datetime.now(),我想改变模型中的字段(taxi_is_closed)从FalseTrue

所以在用户访问帖子之前,我需要(自动)检查时间并修改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()

我只挑选了相关代码。

python django updates detailview
2个回答
0
投票

你可以覆盖get_object方法在chk_closed上调用RecruitView

class RecruitView(PermissionRequiredMixin, generic.DetailView):
    ....
    def get_object(queryset=None):
        obj = super(RecruitView, self).get_object(queryset=queryset)
        obj.chk_closed()
        return obj

0
投票

您可以在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
© www.soinside.com 2019 - 2024. All rights reserved.