#python #django
Вопрос:
Я хочу отобразить весь созданный отдел в одном представлении с помощью цикла for и обновить всю запись одновременно. проблема в том, что он принимает только первую запись и обновляет всю запись значением, введенным в первом поле, которое я пытался использовать .getlist(), но по-прежнему принимает только первую запись. как обновить каждую запись со ссылкой на ее идентификатор, и если поле пустое, сохранить эту запись нетронутой.
Views.py
def department(request):
departments = Department.objects.all()
value1 = request.POST.getlist('BUID')
value2 = request.POST.getlist('GBUID')
print(value1)
print(value2)
Department.objects.update(
BUID=request.POST.get('BUID'),
GBUID=request.POST.get('GBUID'),
)
context = {'departments': departments}
return render(request, 'employee/department.html', context)
models.py
class Department(models.Model):
DepartmentID = models.IntegerField() <------will be Entered by the admin
Name = models.CharField(max_length=200) <------will be Entered by the admin
BUID = models.CharField(max_length=200, blank=True) <------to be updated in the view
GBUID = models.CharField(max_length=200, blank=True) <------to be updated in the view
шаблоны
<form action="" method="POST">
{% csrf_token %}
<h3>Manage Departments</h3>
<input class="btn btn-primary" type="submit" value="Submit">
{% for department in departments %}
<div class="col-sm-6">
<label>Department ID: {{department.DepartmentID}}</label>
</div>
<div class="col-sm-6">
<label>Department Name: {{department.Name}}</label>
</div>
<label>BU/Department Manager Id:</label>
<div class="col-sm-3">
<input name="BUID" class="form-control">
</div>
<label>GBU/Group Department Manager Id:</label>
<div class="col-sm-3">
<input name="GBUID" class="form-control">
</div>
</form>
{% endfor %}
Ответ №1:
Вам нужно изменить views.py файл :-
views.py
def department(request):
departments = Department.objects.all()
value1 = request.POST.getlist('BUID')
value2 = request.POST.getlist('GBUID')
print(value1)
print(value2)
Department.objects.all.update(
BUID=value1,
GBUID=value2
)
context = {'departments': departments}
return render(request, 'employee/department.html', context)
Комментарии:
1. действительно ценю быстрый ответ, который я попробовал в вашем коде, он возвращает объект ‘function’, у которого нет атрибута ‘update’
Ответ №2:
если вы хотите обновить много строк одновременно, вам необходимо использовать следующее https://docs.djangoproject.com/en/3.2/ref/models/querysets/#bulk-update
Примечание: массовое обновление будет игнорировать сигналы, возникающие при сохранении объекта
Ответ №3:
views.py:
from django.http.request import HttpRequest
from django.db.models.query import QuerySet
def department(request: HttpRequest):
departments: QuerySet[Department] = Department.objects.all()
value1 = request.POST.getlist('BUID')
value2 = request.POST.getlist('GBUID')
i = 0
for department in departments:
setattr(department, 'BUID', value1[i])
setattr(department, 'GBUID', value2[i])
department.save()
i
context = {'departments': departments}
return render(request, 'employee/department.html', context)
Также я добавил типы, чтобы вы лучше понимали, что происходит
Комментарии:
1. спасибо за повтор, но, к сожалению, он обновил всю запись с помощью [‘123’], которая является первым полем, которое я ввел
2. Примечание: я не хочу обновлять всю запись одним и тем же вводом, я просто хочу перебирать входные данные внутри цикла for в шаблоне и обновлять BUID, GBUID со ссылкой на DepartmentID
3. О, я думал, что вы хотите обновить его для всех. Затем, если у вас есть данные в списке, вы можете просто for loop выбросить их.