Получение ошибки при попытке удалить команду 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() удалить команду после ее удаления.
- Вместо этого используйте
.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}
- Вероятно, вы хотите снять флажок активной команды пользователя при удалении команды:
@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)