Het omzetten van Booleaanse waarde van Javascript Django?

stemmen
7

Ik heb gemerkt dat wanneer Boole gegevens van javascript wordt verzonden naar Django uitzicht, is het voorbij als true / false (kleine letters) in plaats van True / False (hoofdletters). Dit veroorzaakt een onverwacht gedrag in mijn toepassing. Bijvoorbeeld:

vote.js

    ....
    var xhr = {
        'isUpvote': isUpvote
    };

    $.post(location.href, xhr, function(data) {
        doSomething()
    });

    return false;
});

views.py

def post(self, request, *args, **kwargs):
    isUpvote = request.POST.get('isUpvote')
    vote, created = Vote.objects.get_or_create(user_voted=user_voted)

    vote.isUp = isUpvote
    vote.save()

toen ik deze stemming te besparen en check mijn Django admin pagina, wordt isUpvote ALWAYS ingesteld op True of waar of onwaar van javascript wordt doorgegeven. Dus wat is de beste manier om javascript's waar / onwaar boolean waarde te converteren naar Django's waar / onwaar value ???

Bedankt!!

TOEGEVOEGD :::::

Nou, ik nog wat 'print' lijnen om te controleren of ik iets verkeerd deed in mijn ogen:

    print(vote.isUp)
    vote.isUp = isUpvote
    print(vote.isUp)

    vote.save()

Het resultaat:

    True
    false    //lowercase

En toen ik mijn Django admin, wordt het opgeslagen als True !!! Dus ik denk dat dit betekent lowercaes false wordt opgeslagen als Django True waarde voor wat rare reden ....

De vraag is gesteld op 12/08/2013 om 00:55
user
In andere talen...                            


10 antwoorden

stemmen
1

Javascript middel van het omzetten naar een Boolean

// Uw variabele is degene die je wilt converteren
var myBool = Boolean (yourVariable); 

Maar in uw bovenstaande code lijkt erop dat je passeren een string in plaats van de variabele hier

isUpvote = request.POST.get (isUpvote)

Bent u zeker dat u aan het doen zijn correct?

antwoordde op 12/08/2013 om 01:00
bron van user

stemmen
4

Probeer dit.

from django.utils import simplejson

def post(self, request, *args, **kwargs):
    isUpvote = simplejson.loads(request.POST.get('isUpvote'))
antwoordde op 12/08/2013 om 02:26
bron van user

stemmen
3

Ik zich hetzelfde probleem voor en ik het probleem opgelost met meer duidelijke manier.

Probleem:

Als ik hieronder JSON te sturen naar de server, boolean velden komen als proef ( "true", "false") en ik moet toegang zijn om catalogueszo request.POST.getlist("catalogues[]"). Ook kan ik niet easly maken vorm validatie.

var data = {
   "name": "foo",
   "catalogues": [1,2,3],
   "is_active": false
}

$.post(url, data, doSomething);

Django verzoek handler:

def post(self, request, **kwargs):
    catalogues = request.POST.getlist('catalogues[]')  # this is not so good
    is_active = json.loads(request.POST.get('is_active')) # this is not too

Oplossing

Ik zich te ontdoen van deze problemen door het sturen van JSON gegevens als koord en het omzetten van data om terug naar JSON op server-side.

var reqData = JSON.stringify({"data": data}) // Converting to string
$.post(url, reqData, doSomething);

Django verzoek handler:

def post(self, request, **kwargs):
    data = json.loads(request.POST.get('data'))  # Load from string

    catalogues = data['catalogues'] 
    is_active = data['is_active']

Nu kan ik gemaakt validatie van formulieren en code is meer schoon :)

antwoordde op 20/03/2014 om 12:59
bron van user

stemmen
3

Ik tegenkwam hetzelfde probleem (true / false Javascript - True / False nodig Python), maar hebben het vast met behulp van een kleine functie:

def convert_trueTrue_falseFalse(input):
    if input.lower() == 'false':
        return False
    elif input.lower() == 'true':
        return True
    else:
        raise ValueError("...")

Het kan nuttig zijn om iemand te zijn.

antwoordde op 29/04/2014 om 06:47
bron van user

stemmen
7

Waarschijnlijk zou het beter zijn om te hebben 'isUpvote' waarde als string 'waar' of 'onwaar' en het gebruik JSON zijn boolean waarde onderscheiden

import json

isUpvote = json.loads(request.POST.get('isUpvote', 'false')) # python boolean
antwoordde op 13/07/2015 om 11:40
bron van user

stemmen
0

Met Python's ternaire operator :

isUpvote = True if request.POST.get("isUpvote") == "true" else False

antwoordde op 10/07/2017 om 22:52
bron van user

stemmen
0

Sinds Django 1,5 gedropt ondersteuning voor Python 2.5, django.utils.simplejson geen deel meer uitmaakt van Django als je Python's gebouwd in JSON in plaats daarvan, die dezelfde API kunt gebruiken:

import json

def view_function(request):
    json_boolean_to_python_boolean = json.loads(request.POST.get('json_field'))
antwoordde op 03/05/2018 om 07:54
bron van user

stemmen
0

Ik meestal omzetten JavaScript Booleaanse waarde in getal.

var xhr = {
    'isUpvote': Number(isUpvote)
};

In python:

try:
  is_upvote = bool(int(request.POST.get('isUpvote', 0)))
except ValueError:
  // handle exception here
antwoordde op 11/10/2018 om 04:20
bron van user

stemmen
0
isUpvote = request.POST.get("isUpvote")
isUpvote = isUpvote == True or isUpvote == "true" or isUpvote == "True"
antwoordde op 08/08/2019 om 13:53
bron van user

stemmen
0

Een ander alternatief is literal_eval te gebruiken () van ast (Abstract Syntax Tree) bibliotheek.

In Javascript / jQuery:

$.ajax({
    url: <!-- url for your view -->,
    type: "POST",
    data: {
        is_enabled: $("#id_enable_feature").prop("checked").toString() <!-- Here it's either true or false> 
    }
})

In je Django uitzicht,

from ast import literal_eval

def example_view(request):
    is_enabled = literal_eval((request.POST.get('is_enabled')).capitalize())
    print(is_enabled)    # Here, you can check the boolean value in python like True or False
antwoordde op 02/01/2020 om 10:02
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more