Как установить поле выбора, содержащее этажи здания, если в базе данных показано максимально возможное количество этажей и установлен первичный ключ

Я хочу отобразить этажи от 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'),

]

Надеюсь, это поможет кому-то из нуждающихся. Оставляйте любые сомнения или вопросы в комментариях, и я постараюсь сделать все возможное, чтобы помочь вам. Также, если есть лучший способ сделать это, пожалуйста, поделитесь своими ответами.

Вернуться на верх