2017-12-18 20 views
0

장고에서 DetailView를 사용하고 있습니다. 나는 특정 시간 필드 (taxi_time)를 포함한 모델을 가지고 있으며, 지금은 시간을 비교하고 싶습니다. taxi_time < datetime.now() 인 경우 모델의 taxi_is_closed 필드를 False에서 True으로 변경하고 싶습니다.액세스하기 전에 액세스하기 전에 DetailView (Django)

그래서 사용자가 게시물에 액세스하기 전에 (자동으로) 시간을 확인하고 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 

MY 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() 

난 단지 관련 코드를 들었다.

답변

0

get_object 메서드를 덮어 쓰면 chk_closedRecruitView에 호출 할 수 있습니다.

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