Есть несколько проблем с вашим кодом.
- Нет связи между
Create_Team
и manager
моделью. - Атрибут
name
на вашем *Теги 1009 * не соответствуют ключу, который вы используете для чтения с request.POST
.manager_{{manager.id}}
отображается как manager_
, поэтому int(request.POST.get('manager', 1))
всегда будет возвращать 1. - Формы в вашем шаблоне не содержат информацию о том, какую команду вы хотите обновить.
- Вы не делаетеустановите атрибут
selected
на любой <option>
.Как следствие, всегда будет выбран первый вариант. - Вы не обновляете ни одной команды по вашему мнению.
Давайте рассмотрим эти проблемы.
1 -Мы исправляем модели, добавляя ForeignKey
от CreateTeam
до Manager
.Обратите внимание, что я переименовал модели, что не является обязательным.Если вы решили сохранить свои имена, измените их соответствующим образом.
# models.py
from django.db import models
class CreateTeam(models.Model):
first_name = models.CharField(max_length= 50)
last_name = models.CharField(max_length= 50)
company_name = models.CharField(max_length= 100)
address = models.CharField(max_length= 1000)
state = models.CharField(max_length= 100)
city = models.CharField(max_length= 100)
status = models.CharField(max_length= 30)
manager = models.ForeignKey('Manager', on_delete=models.SET_NULL, null=True, blank=True)
class Manager(models.Model):
name = models.CharField(max_length= 500)
designation = models.CharField(max_length= 500)
Вы должны передать два бита информации в представление assign
: id
из CreateTeam
, который вы хотите назначить, иid
из Manager
, которому вы хотите присвоить его.
Обратите внимание, что атрибут name
полей формы является ключом в request.POST
.Это может быть любая строка, просто убедитесь, что она совпадает между формой и представлением.Очевидно, что жизнь дает им выразительное имя.
2 - Отправка id
из Manager
обрабатывается <select>
.Просто убедитесь, что атрибут name
соответствует ключу, который вы используете в своем представлении.
3 - Чтобы отправить id
команды, вы можете использовать <button type="submit">
с именем и значением вместо<input type="submit">
.
<button class="btn btn-raised btn-primary btn-round waves-effect" type="submit" name="team" value="{{ team.id }}">Assign</button>
</td>
В качестве альтернативы, вы можете использовать скрытое поле.
4 - Наконец, вы должны установить атрибут selected
на правильный <option>
в вашем <select>
.Вы можете сделать это следующим образом:
<option value="{{manager.id}}" {% if team.manager.id == manager.id %}selected{% endif %}
Вот полный шаблон:
<html>
<head></head>
<body>
<table>
<thead>
<tr>
<th>S No.</th>
<th>COMPANY NAME</th>
<th>TEAM MEMBER</th>
<th>EMAIL</th>
<th>ASSIGN TEAM</th>
</tr>
</thead>
<tbody>
{%for team in teams%}
<tr>
<form id="form_id" method="POST" action="{% url 'accept' %}">
{% csrf_token %}
<th scope="row"> {{ forloop.counter }}</th>
<td>{{team.company_name}}</td>
<td>{{team.team_member}}</td>
<td>{{team.email}}</td>
<td>
<select name="manager">
{% for manager in managers %}
<option value="{{manager.id}}" {% if team.manager.id == manager.id %}selected{% endif %}>{{manager.name}}</option>
{% endfor %}
</select>
</td>
<td>
<button class="btn btn-raised btn-primary btn-round waves-effect" type="submit" name="team" value="{{ team.id }}">Assign</button>
</td>
</form>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
5 - При получении запроса POST вы можете назначить менеджера для команды.Это означает, что вы должны использовать значения id
, чтобы получить экземпляр CreateTeam
и экземпляр Manager
.Затем вы присваиваете Manager
для createteam.manager
и сохраняете объект createteam
.
from django.shortcuts import get_object_or_404, redirect, render
from .models import CreateTeam, Manager
def accept(request):
teams = CreateTeam.objects.filter(status='Accept')
managers = Manager.objects.all()
if request.method == 'POST':
createteam_id = int(request.POST.get('team', 1))
manager_id = int(request.POST.get('manager', 1))
createteam = get_object_or_404(teams, pk=createteam_id)
createteam.manager = get_object_or_404(Manager, pk=manager_id)
createteam.save()
redirect('accept')
return render(request, "admin/accept.html", {"teams": teams, "managers": managers})
Выделите три вещи:
- Мы используем
get_object_or_404
вместоModel.objects.get
.Как следует из названия, он возвращает 404, если модель не может быть найдена.Это служит простой обработкой ошибок для крайних случаев, таких как пользователь, манипулирующий формой, или менеджер, удаляемый, когда у пользователя открыта страница.Эту обработку ошибок можно улучшить, чтобы сделать ее более удобной для пользователя, но это только начало. get_object_or_404
может использовать модель или набор запросов.Мы загружаем экземпляр команды из отфильтрованного набора запросов teams
.В противном случае пользователь может манипулировать формой и назначить менеджера для команды, которая имеет статус, отличный от Accept
. - После сохранения команды мы перенаправляем на страницу
accept
.Это хорошая практика и гарантирует, что пользователь может перезагрузить страницу, не видя диалоговое окно do you want to resubmit this form
.
Наконец, убедитесь, что это представление действительно доступно только для администратора, например, добавив соответствующийuser_passes_test
декоратор.