Передача дополнительных данных в DetailView Django
У меня есть FBV, где я вычисляю временную дельту (td) и передаю ее в моем контексте:
def update_moc(request, pk):
moc = get_object_or_404(Moc, pk=pk)
today = datetime.date.today()
time = moc.initiation_date
time_delta = today - time
td=str(time_delta)
initiator = moc.initiator
status = moc.moc_status
coordinator = moc.coordinators.filter(coordinator_name=request.user)
if request.user.is_superuser or (initiator == request.user or coordinator) and status == 'draft':
form = MocUpdateForm(request.POST or None, instance=moc)
today = datetime.date.today()
time = moc.initiation_date
time_delta = today - time
td=str(time_delta)
if form.is_valid():
moc.initiator = request.user
form.save()
return HttpResponseRedirect(reverse('moc_content_detail', kwargs={'pk': pk}))
else:
return render(request, 'moc/moc_content.html', context={'moc':moc, 'form':form, 'td': td})
else:
raise Http404()
Однако для DetailView у меня есть CBV и я хочу передать ту же самую дельту времени (td) в качестве дополнительного контекста, но не могу понять, как это сделать... Я пробовал несколько подходов для передачи
class MocDetailView(LoginRequiredMixin, DetailView):
model = Moc
template_name = 'moc/moc_detail.html'
def get_context_data(self, *args, **kwargs):
context = super(MocDetailView, self).get_context_data(*args, **kwargs)
context['td'] = # This is where I need help
def get_object(self, queryset=None):
obj = super(MocDetailView, self).get_object(queryset=queryset)
confidential = obj.confidential
initiator = obj.initiator
.....
if self.request.user.is_superuser or initiator == self.request.user or verifier or coordinator or reviewer or approver or preimplement or authorizer or postimplement or closer and confidential == True:
return obj
elif not confidential:
return obj
else:
raise Http404()
Подскажите, пожалуйста?
Вы можете использовать self.object
для вычисления таймдельта:
def get_context_data(self, *args, **kwargs):
context = super(MocDetailView, self).get_context_data(*args, **kwargs)
time = self.object.initiation_date
today = datetime.date.today()
time_delta = today - time
td=str(time_delta)
context['td'] = td
return context
Это должно работать, потому что Django присваивает результат метода get_object()
переменной self.object
. Вы можете проверить исходный код здесь.
Также Django передает объект в get_context_data
напрямую, поэтому его также можно получить из kwargs
:
def get_context_data(self, *args, **kwargs):
context = super(MocDetailView, self).get_context_data(*args, **kwargs)
time = kwargs['object'].initiation_date
# rest of the code