Django - Невозможно получить конкретный первичный ключ (id) для объекта в списке объектов

Я пытаюсь получить конкретный пк выбранного объекта, когда пользователь принимает доставку. Моя проблема в том, что я каждый раз получаю только pk первого объекта в списке. Я хочу получить пк выбранного объекта.

просмотров:

@login_required(login_url="/signin/?next=/driver/")
def deliveries_available_page(request):

    deliveries = Delivery.objects.filter(
        status_of_delivery__in=[Delivery.DELIVERY_POSTED]
    )
    
    #When driver accept delivery then status of delivery changes to delivering
    if request.method == 'POST':
        delivery = get_object_or_404(Delivery, pk=request.POST.get('receipt_number'))
        if delivery:
            delivery.status_of_delivery = Delivery.DELIVERY_DELIVERING
            delivery.driver = request.user.driver
            messages.success(request, 'Delivery Accepted')
            delivery.save()
    
        return redirect(reverse('driver:deliveries_available'))
    return render(request, 'driver/deliveries_available.html', {
        "GOOGLE_API_MAP": settings.GOOGLE_API_MAP,
        "del": deliveries
    })

HTML:

<div class="d-flex flex-column h-100" style="padding-bottom: 50px">
    <div id="map"></div>
    {% if del %}
    {% for d in del %}
    <div class="card" id="delivery-popup">
        <div class="card-body p-2">
            <div class="details">
                <div class="p-2">
                    <strong id="address"></strong>
                    <div>
                        <strong id="show-info"></strong>
                    </div>
                    <div>
                        <strong id="show-distance"></strong>
                        <strong id="show-duration"></strong>
                    </div>
                    <div>
                        <strong id="show-price"></strong>
                        <strong id="show-id"></strong>
                    </div>


                    <div>
                        <form method="POST">
                            {% csrf_token %}
                            <button type="submit" class="btn btn-primary"        name="accept">Accept</button>
                            <input type="hidden" value="{{ d.receipt_number }}" name="receipt_number">
                        </form>
                    </div>
                    
  
                    {% if messages %}
                    {% for m in messages %}
                    {% if m.tags %}
                    <script>alert("{{ m }}")</script>
                    {% endif %}
                    {% endfor %}
                    {% endif %}
                </div>
            </div>
        </div>
    </div>
    {% endfor %}
    {% endif %}

When i click on the address the pk stays the same

Мне нужен конкретный пк, чтобы когда пользователь принимает доставку, то нужная доставка принималась и удалялась с карты. Любая помощь будет принята с благодарностью. Спасибо.

Я могу получить конкретный пк, создав новый url и передав его в url, но я хочу, чтобы пользователь принял доставку на странице карты.

Решено:

Получил конкретный пк, когда я нажимаю на доставку, он получает правильный пк, код ниже, если у кого-то такая же проблема:

script

function PopUpDelivery(delivery) {
    $("#delivery-popup").css("display", "block");
    $("#address").html(delivery.address);
    $("#show-distance").html(delivery.distance + " Km");
    $("#show-duration").html(delivery.duration + " Mins");
    $("#show-price").html("€ " + delivery.price);
    $("#show-info").html("Info : " + delivery.information);
    $("#show-id").html("Pk : " + delivery.receipt_number);
    
    var input_tag = getTag('getpk');
    input_tag.value = delivery.receipt_number;
}
function getTag(id){
    return document.getElementById(id);
}

html

<button type="submit" class="btn btn-primary" name="accept">Accept</button>
                        <input type="hidden" id="getpk" value="" name="receipt_number">

Сохранить уникальный идентификатор в html-документе

Идентификатор в HTML-документе должен быть уникальным в пределах каждой страницы source:

Глобальный атрибут id определяет идентификатор (ID), который должен быть уникальным во всем документе. Его цель - идентифицировать элемент при связывании (с помощью идентификатора фрагмента), написании сценария или стилизации (с помощью CSS).

Как мне кажется, возможно, дело в том, что поскольку у вас много карточек на каждой странице, все с одинаковыми id, вы получаете только первую. Хотя ваше решение работает, я думаю, что было бы лучше дать каждому id уникальное значение, что можно сделать, просто добавив pk или любое другое уникальное поле к именам id. При этом функция getTag может не понадобиться. Вот что я имею в виду:

html

<div class="d-flex flex-column h-100" style="padding-bottom: 50px">
    <div id="map"></div>
    {% if del %}
    {% for d in del %}
    <div class="card" id="delivery-popup">
        <div class="card-body p-2">
            <div class="details">
                <div class="p-2">
                    <strong id="address{{ d.pk }}"></strong>
                    <div>
                        <strong id="show-info{{ d.pk }}"></strong>
                    </div>
                    <div>
                        <strong id="show-distance{{ d.pk }}"></strong>
                        <strong id="show-duration{{ d.pk }}"></strong>
                    </div>
                    <div>
                        <strong id="show-price{{ d.pk }}"></strong>
                        <strong id="show-id{{ d.pk }}"></strong>
                    </div>


                    <div>
                        <form method="POST">
                            {% csrf_token %}
                            <button type="submit" class="btn btn-primary"        name="accept">Accept</button>
                            <input type="hidden" value="{{ d.receipt_number }}" name="receipt_number">
                        </form>
                    </div>
                    
  
                    {% if messages %}
                    {% for m in messages %}
                    {% if m.tags %}
                    <script>alert("{{ m }}")</script>
                    {% endif %}
                    {% endfor %}
                    {% endif %}
                </div>
            </div>
        </div>
    </div>
    {% endfor %}
    {% endif %}

script

<script>
//Google map and using api to display deliveries on map and click event to show delivery details
function initMap() {
    const map = new google.maps.Map(document.getElementById("map"), {
        center: { lat: 53.350140, lng: -6.266155 },
        zoom: 13,
    });

    fetch("{% url 'driver:available_deliveries' %}").then(response => response.json()).then(json => {
        console.log(json);

        for (let d = 0; d < json.deliveries.length; d++) {
            const delivery = json.deliveries[d];
            const position = { lat: delivery.delivery_address_latitude, lng: delivery.delivery_address_longitude };
            const show_on_map = new google.maps.Marker
                ({
                    position,
                    map,
                });

            new google.maps.InfoWindow({
                content: "<small><strong>" + delivery.address + "<medium><br>€" + delivery.price
            }).open(map, show_on_map);

            show_on_map.addListener("click", () => {
                PopUpDelivery(delivery);
            })
        }
    })
}

function PopUpDelivery(delivery) {
    let pk = delivery.pk
    $("#delivery-popup"+pk).css("display", "block");
    $("#address"+pk).html(delivery.address);
    $("#show-distance"+pk).html(delivery.distance + " Km");
    $("#show-duration"+pk).html(delivery.duration + " Mins");
    $("#show-price"+pk).html("€ " + delivery.price);
    $("#show-info"+pk).html("Info : " + delivery.information);
    $("#show-id"+pk).html("Pk : " + delivery.receipt_number)
}
Вернуться на верх