Получение ошибки при попытке удалить команду Django

Когда я пытаюсь добавить delete к моим представлениям, я получаю ошибку:

Запрос, соответствующий команде, не существует.

Что я делаю не так? Похоже, что трассировка приводит меня к context_processor.py. Вот мой код ниже:

Views.py

@login_required
def team(request, team_id):
    team = get_object_or_404(Team, pk=team_id, status=Team.ACTIVE, members__in=[request.user])
    invitations = team.invitations.filter(status=Invitation.INVITED) 

    return render(request, 'team/team.html', {'team': team, 'invitations': invitations})

@login_required
def activate_team(request, team_id):
    team = get_object_or_404(Team, pk=team_id, status=Team.ACTIVE, members__in=[request.user])
    userprofile = request.user.profile
    userprofile.active_team_id = team.id
    userprofile.save()

    messages.info(request, 'The team was activated')

    return redirect('team:team', team_id=team.id)

@login_required
def add(request):
    profile = request.user.profile
    form = TeamForm()
    if request.method == 'POST':
        form = TeamForm(request.POST, request.FILES)

        if form.is_valid():
            team = form.save(commit=False)
            team.created_by = request.user
            team.save()
            team.members.add(request.user)


            profile.active_team_id = team.id
            profile.save()

            return redirect('account')

    context = {'form': form}
    return render(request, 'team/add.html', context)

@login_required
def edit(request):
    #profile = request.user.profile
    team = get_object_or_404(Team, pk=request.user.profile.active_team_id, status=Team.ACTIVE, members__in=[request.user])
    form = TeamForm(instance=team)
    if request.method == 'POST':
        form = TeamForm(request.POST, request.FILES, instance=team)

        if form.is_valid():            
            team.save()           

            messages.info(request, 'The changes was saved')

            return redirect('team:team', team_id=team.id)

    context = {'form': form, 'team': team}
    return render(request, 'team/edit.html', context)

@login_required
def delete(request, pk):    
    team = Team.objects.get(pk=request.user.profile.active_team_id)
    if request.method == 'POST':
        team.delete()
        return redirect('account')
    context = {'object': team}
    return render(request, 'team/delete.html', context)

urls.py

urlpatterns = [
    path('add/', add, name='add'),
    path('edit/', edit, name='edit'),
    path('delete/', delete, name='delete'),
    path('invite/', invite, name='invite'),
    path('activate_team/<int:team_id>/', activate_team, name='activate_team'),
    path('<int:team_id>/', team, name='team'),
    path('teams_page/<int:team_id>/', teams_page, name='teams_page'),
]

delete.html

{% extends 'main.html' %}

{% block content %}


<!-- Main Section -->
<main class="formPage my-xl">
    <div class="content-box">
        <div class="formWrapper">

            <br>

            <form class="form" action="" method="POST">
                {% csrf_token %}
                <p>Are you sure you want to delete "{{object}}"?</p>

                <a class="btn btn--sub btn--lg  my-md" href="{{request.GET.next}}">Go Back</a>

                <input class="btn btn--sub btn--lg  my-md" type="submit" value="Confirm" />
            </form>
        </div>
    </div>
</main>

{% endblock %}

context_processors.py

from .models import Team

def active_team(request):
    if request.user.is_authenticated:
        if request.user.profile.active_team_id:
            team = Team.objects.get(pk=request.user.profile.active_team_id)

            return {'active_team': team}
            
    return {'active_team': None}

Отслеживание ошибки:

Traceback Переход к представлению копирования и вставки

D:\anaconda3\envs\gla-website\lib\site-packages\django\core\handlers\exception.py, line 47, in inner

                    response = get_response(request)

     …
▶ Local vars
D:\anaconda3\envs\gla-website\lib\site-packages\django\core\handlers\base.py, line 181, in _get_response

                    response = wrapped_callback(request, *callback_args, **callback_kwargs)

     …
▶ Local vars
D:\GLA-WEBSITE\gla\index\views.py, line 13, in index

        return render(request, 'index/index.html',context)

     …
▶ Local vars
D:\anaconda3\envs\gla-website\lib\site-packages\django\shortcuts.py, line 19, in render

        content = loader.render_to_string(template_name, context, request, using=using)

     …
▶ Local vars
D:\anaconda3\envs\gla-website\lib\site-packages\django\template\loader.py, line 62, in render_to_string

        return template.render(context, request)

     …
▶ Local vars
D:\anaconda3\envs\gla-website\lib\site-packages\django\template\backends\django.py, line 61, in render

                return self.template.render(context)

     …
▶ Local vars
D:\anaconda3\envs\gla-website\lib\site-packages\django\template\base.py, line 168, in render

                    with context.bind_template(self):

     …
▶ Local vars
D:\anaconda3\envs\gla-website\lib\contextlib.py, line 119, in __enter__

                return next(self.gen)

     …
▶ Local vars
D:\anaconda3\envs\gla-website\lib\site-packages\django\template\context.py, line 244, in bind_template

                updates.update(processor(self.request))

     …
▶ Local vars
D:\GLA-WEBSITE\gla\team\context_processors.py, line 7, in active_team

                team = Team.objects.get(pk=request.user.profile.active_team_id)

     …
▶ Local vars
D:\anaconda3\envs\gla-website\lib\site-packages\django\db\models\manager.py, line 85, in manager_method

                    return getattr(self.get_queryset(), name)(*args, **kwargs)

     …
▶ Local vars
D:\anaconda3\envs\gla-website\lib\site-packages\django\db\models\query.py, line 435, in get

                raise self.model.DoesNotExist(

     

Я считаю, что запрос на удаление

team = Team.objects.get(pk=request.user.profile.active_team_id)

не возвращает никакого результата, поэтому вы не можете выполнить удаление с объектом team

попробуйте следующее:

@login_required
def delete(request, pk):    
  try:
      team = Team.objects.get(pk=request.user.profile.active_team_id)
      if request.method == 'POST':
          team.delete()
          return redirect('account')
      context = {'object': team}
      return render(request, 'team/delete.html', context)
  except Team.DoesNotExist:
      raise Http404("No Team found for the user")

или лучше использовать get_object_or_404, как в функции edit:

@login_required
def delete(request, pk):    
  team = get_object_or_404(Team, pk=request.user.profile.active_team_id)
  if request.method == 'POST':
      team.delete()
      return redirect('account')
  context = {'object': team}
  return render(request, 'team/delete.html', context)

Контекстные процессоры выполняются всякий раз, когда происходит рендеринг шаблона.

Вы не можете .get() удалить команду после ее удаления.

  1. Вместо этого используйте .filter() и .first():
def active_team(request):
    if request.user.is_authenticated:
        if request.user.profile.active_team_id:
            # team = Team.objects.get(pk=request.user.profile.active_team_id)           # Change this
            team = Team.objects.filter(pk=request.user.profile.active_team_id).first()  # to this

            return {'active_team': team}
            
    return {'active_team': None}
  1. Вероятно, вы хотите снять флажок активной команды пользователя при удалении команды:
@login_required
def delete(request, pk):    
    team = Team.objects.get(pk=request.user.profile.active_team_id)
    if request.method == 'POST':
        team.delete()

        # Unset user's active team
        request.user.profile.active_team_id = None
        request.user.save()

        return redirect('account')
    context = {'object': team}
    return render(request, 'team/delete.html', context)
Вернуться на верх