Как установить поле выбора, содержащее этажи здания, если в базе данных показано максимально возможное количество этажей и установлен первичный ключ
Я хочу отобразить этажи от 1 до максимального количества этажей в виде выпадающего списка. Это "максимальное количество этажей" должно быть получено из первичного ключа, который был установлен ранее как другое поле выбора.
room.html
<!DOCTYPE html>
<html>
<head>
<title>Room</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>Room</h1>
<form method="post">
{% csrf_token %} Room Name
<br>
<input type="text" name="room_name" value="">
<br> Room Type
<br>
<select class="" name="room_type">
<option value="Class Room">Class Room</option>
<option value="Department">Department</option>
<option value="Club">Club</option>
<option value="Lab">lab</option>
<option value="Other">Other</option>
</select>
<br> Block Number
<br>
<select class="" name="block_number">
{% for block in blocks %}
<option value="{{ block.block_number }}">{{ block.block_name }}</option>
{% endfor %}
</select>
<br> Floor
<br>
<select class="" name="floor">
<option selected disabled>Choose a Floor</option>
</select>
<br>
<input type="submit" name="submit" value="submit">
</form>
</body>
</html>
Room views.py
from django.shortcuts import render
from room.models import Room
from block.models import Block
def room(request):
blocks = Block.objects.all()
if request.method == 'POST':
ob = Room()
ob.room_name = request.POST.get('room_name')
ob.room_type = request.POST.get('room_type')
ob.block_number = request.POST.get('block_number')
ob.floor = request.POST.get('floor')
ob.save()
return render(request, 'room/room.html', {'blocks': blocks})
def room_out(request):
ob = Room.objects.all()
context = {
'value': ob
}
return render(request, 'room/room_out.html', context)
block.html
<!DOCTYPE html>
<html>
<head>
<title>Block</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>Block</h1>
<form method="post">
{% csrf_token %}
Block Number
<br>
<input type="number" name="block_number" value="">
<br>
Block Name
<br>
<input type="text" name="block_name" value="">
<br>
Number Of Floors
<br>
<input type="number" name="number_of_floors" value="">
<br>
<input type="submit" name="submit" value="submit">
</form>
</body>
</html>
Заблокировать views.py
from django.shortcuts import render
from block.models import Block
# Create your views here.
def block(request):
if request.method == 'POST':
ob = Block()
ob.block_name = request.POST.get('block_name')
ob.number_of_floors = request.POST.get('number_of_floors')
ob.save()
return render(request, 'block/block.html')
def block_out(request):
ob = Block.objects.all()
context = {
'value': ob
}
return render(request, 'block/block_out.html', context)
Я новичок в Django и базах данных в целом, поэтому я буду очень признателен, если вы найдете время, чтобы объяснить, что мне нужно сделать.
После долгих копаний я наконец нашел способ сделать то, что хотел. Решением стал AJAX. Вот как теперь выглядят файлы:
room.html
<!DOCTYPE html>
<html>
<head>
<title>Room</title>
<!--link rel="stylesheet" href="style.css"-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
function fun() {
$.ajax({
type: 'GET',
url: '/room/blocks-json',
success: function (response) {
//console.log(response.data);
const blockData = response.data;
var blockNumber = document.getElementById("block_ddl").value;
var options = "<option selected disabled>--Select a floor--</option>";
var floors, i;
$.each(blockData, function (index, item) {
if (item.block_number == blockNumber) {
floors = item.number_of_floors;
//console.log(floors);
for (i = 1; i <= floors; i++) {
options += "<option value='" + i + "'>" + i + "</option>";
}
document.getElementById('floor_ddl').innerHTML = options;
}
});
},
error: function (error) {
console.log(error)
}
});
}
</script>
</head>
<body>
<h1>Room</h1>
<form method="post">
{% csrf_token %}
Room Name
<br>
<input type="text" name="room_name" value="">
<br>
Room Type
<br>
<select class="" name="room_type">
<option value="Class Room">Class Room</option>
<option value="Department">Department</option>
<option value="Club">Club</option>
<option value="Lab">lab</option>
<option value="Other">Other</option>
</select>
<br>
Block Number
<br>
<select class="" name="block_number" id="block_ddl" onchange="fun()">
<option selected disabled>--Choose a Block--</option>
{% for block in blocks %}
<option value="{{ block.block_number }}">{{ block.block_name }}</option>
{% endfor %}
</select>
<br>
Floor
<br>
<select class="" name="floor" id="floor_ddl">
<option selected disabled>--Select a floor--</option>
</select>
<br>
<input type="submit" name="submit" value="submit">
</form>
</body>
</html>
room views.py
from django.shortcuts import render
from django.http import JsonResponse
from room.models import Room
from block.models import Block
# Create your views here.
def room(request):
blocks = Block.objects.all()
if request.method == 'POST':
ob = Room()
ob.room_name = request.POST.get('room_name')
ob.room_type = request.POST.get('room_type')
ob.block_number = request.POST.get('block_number')
ob.floor = request.POST.get('floor')
ob.save()
return render(request, 'room/room.html', {'blocks': blocks})
def get_json_block_data(request):
ob_val = list(Block.objects.values())
context = {
'data': ob_val
}
return JsonResponse(context)
Также мне нужно было внести следующие изменения в файл room url.py
rooms url.py
from django.conf.urls import url
from room import views
urlpatterns = [
url('rom/', views.room),
url('blocks-json/', views.get_json_block_data, name='blocks-json'),
]
Надеюсь, это поможет кому-то из нуждающихся. Оставляйте любые сомнения или вопросы в комментариях, и я постараюсь сделать все возможное, чтобы помочь вам. Также, если есть лучший способ сделать это, пожалуйста, поделитесь своими ответами.