Как автозаполнить форму на основе выбранного 'id' с помощью javascript или ajax в django

<
class Fuel(models.Model):
vehicle = models.ForeignKey(Vehicle, on_delete=models.CASCADE)
previous_km = models.IntegerField(blank=False, null=False)
progressive_km = models.IntegerField(blank=False, null=False)

когда я выбираю автомобиль, то соответствующий автомобиль previous_km автоматически заполняется в форме. здесь написан простой код javascript вручную, но я хочу взять из базы данных.

<script>
let usersData = [
    {
        id: 1,
        email: "u1@gmail.com",
        fname: "fname-1",
        lname: "lname-1",
        previous_km : 1000,
    },
    {
        id: 2,
        email: "u2@gmail.com",
        fname: "fname-2",
        lname: "lname-2",
        previous_km : 2000,
    },

];
document.getElementById('vehicle').onchange = (e) => {
    let selectedUser = usersData.find(userdata => userdata.id == e.target.value);
    console.log(selectedUser);
    document.getElementById('previous_km').value = selectedUser.previous_km;

};

В целом это то, что я бы сделал. Здесь используется JQuery + Ajax для обработки постинга.

Javascript (JQuery)

$(document).ready(function() {
    $("#vehicle").change(function(){
        if ($(this).val() == ''){
            // value is blank, don't post
            return;
        };

        postdata = {
            'vehicle_pk': $(this).val(),

            // token if being logged in is required
            'csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val(),
            //  This needs to be in template: {% csrf_token %}
        };

            
        $.ajax({
            method: 'post',
            url: 'url_to_view', // put your url here
            data: data,
            beforeSend: function(){
              $('#ajaxSendingDiv').fadeIn().attr({'reload':1});
            },
            success: function(data){
                console.log(data);
                if (data['status']){
                    $('#previous_km').val(data['previous_km']);
                    // do thing
                }else{
                    alert(data['msg']);
                };
            },
            error: function(event,xhr,settings,errorText){
                //xhr.status general meanings:
                // 0    = Server didn't Reply (server down)
                // 400  = Bad Request         (Syntax Error)
                // 403  = Forbidden           (Login Token Expired)
                // 403  = Not Found           (Invalid Url)
                // 500  = Server Error        (Django Crash)
            },
        });
    });
};

View.oy (общий)

def GetPrevKM(request):
    if request.method == 'POST':
        data = {'status':False}

        # do your query + return the data..
        #   I'm not 100% on how your models are set up
        #       but this is the general format
        obj = Fuel.objects.filter(pk=request.POST.get('vehicle_pk'))
        if obj:
            data['status'] = True
            data['previous_km'] = obj.previous_km
            data['progressive_km'] = obj.progressive_km
            data['msg'] = 'Returned Fuel Information'
        else:
            data['msg'] = 'No Fuel found on row: {0}'.format(request.POST.get('vehicle_pk'))

        import json
        return HttpResponse(
            json.dumps(data),
            content_type="application/json"
        )

    # Post only View!
    from django.http import Http404
    raise Http404

И я рекомендую попробовать использовать JQuery больше, вы можете получить гораздо больше работы быстрее (имо), и кажется, что многие люди используют его для таких вещей

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