Запрос задает слишком много объектов для распаковки ожидается(2) в django templateView
Я написал представление для показа открытых, завершенных, принятых и закрытых тикетов на приборной панели, при нажатии на которое происходит переход на определенный url для отображения тикетов соответственно и переключение шаблонов в зависимости от их статуса, я запрашиваю статус тикета и получаю следующую ошибку too many objects to unpack (expected 2)
models.py
class Ticket(models.Model):
ticket_title = models.CharField(max_length=200)
ticket_description = models.TextField()
created_by = models.ForeignKey(User,related_name = 'created_by',blank=True,null=True,on_delete=models.CASCADE)
STATUS_CHOICES = (
('Opened','Opened'),
('Accepted','Accepted'),
('Completed','Completed'),
('Closed','Closed')
)
status = models.CharField('Status',choices=STATUS_CHOICES,max_length = 100,default = 'Opened')
closed_date = models.DateTimeField(blank=True,null=True)
completed_date = models.DateTimeField(blank=True,null=True)
accepted_date = models.DateTimeField(blank=True,null=True)
opened_date = models.DateTimeField(blank=True,null=True)
accepted_by = models.ForeignKey(User,related_name='assigned_to',on_delete=models.CASCADE,blank=True,null=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
def __str__(self):
return self.ticket_title
Views.py
class DeveloperTicketView(TemplateView):
def get_template_names(self):
ticket_type = Ticket.objects.filter('status')
if ticket_type == "Opened":
template_name = 'app/open_tickets.html'
elif ticket_type == 'Accepted':
template_name = 'app/dev_accepted_ticket.html'
elif ticket_type == 'Completed':
template_name = 'app/dev_completed_tickets.html'
else:
template_name = 'app/dev_closed_tickets.html'
return template_name
def get_context_data(self, **kwargs):
context = super(TemplateView,self).get_context_data(**kwargs)
context['open_tickets'] = Ticket.objects.filter(status = 'Opened')
context['accepted_tickets'] = Ticket.objects.filter(status = 'Accepted',accepted_by = self.request.user)
context['completed_tickets'] = Ticket.objects.filter(status = 'Completed',accepted_by = self.request.user)
context['closed_tickets'] = Ticket.objects.filter(status = 'Closed',accepted_by = self.request.user)
return context
Ошибка связана с этим запросом...
Ticket.objects.filter('status')
Вы должны указать что-то вроде:
if Ticket.objects.filter(status='Opened'):
template_name = 'app/open_tickets.html')
Также, пожалуйста, проверьте логику. Вышеприведенный запрос не имеет смысла в get_template_name... Вы должны получить один шаблон в соответствии с запросом. Так, если запрос 'opened', то вы должны получить шаблон только для 'opened'.
Предположим, если вы хотите получить для 'opened', вам нужно передать его в запросе и сделать следующее:
if self.request.get('status') == 'Opened':
template_name = 'app/open_tickets.html')
def show_ticket(request,status):
if status.title() in ['Opened','Accepted','Completed','Closed']:
if status.title() == 'Opened':
tickets = Ticket.objects.filter(status='Opened')
else:
tickets = Ticket.objects.filter(status=status.title(),accepted_by=request.user)
templates = {'Opened':'app/open_tickets.html','Accepted':'app/dev_accepted_ticket.html','Completed':'app/dev_completed_tickets.html','Closed':'app/dev_closed_tickets.html'}
return render(request,templates[status.title()],{'tickets':tickets})
внутри вашего urls.py
path('tickets/<str:status>/',views.show_ticket,name='show_ticket')