Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Django, parametre d'url variable.

+1 vote

Actuellement, je recupere un id dans une requete de type ajax, et je renvoie un json avec les infos relatives a l'id fourni dans l'url. Voici un extrait de mon code:

def get_urls(self):
        urls = super(PhotoModelAdmin, self).get_urls()
        custom_photo_urls = patterns('',
                                    url(r'informations/(?P<photo_id>\d+)/$',                                    
                                    self.admin_site.admin_view(self.informations),
                                    name='photo-informations'),)
        return custom_photo_urls + urls

    def informations(self, request, photo_id):
        if request.is_ajax():
            photo = get_object_or_404(Photo, id=photo_id)
            json_data = {'title': photo.title,
                          'description': photo.description,
                          'image': photo.image.url}
        else:
            json_data = {'error': "You're the lying type, I can just tell."}
        return JsonResponse(data=json_data)

Est il possible de reecrire ma config d'url afin de capturer une url du style "/informations/ids=[5,7,15]/". Pour renvoyer en une seule fois, le json relatif aux objets dont les ids sont a l'interieur de la liste ids captée ds l'url?

A la limite, quels sont vos suggestions et conseils pour capter ds une url, un parametre dynamique, un parametre qui serait proche d'une liste?

demandé 19-Mar-2015 par Nsukami_ (1,998 points)

2 Réponses

0 votes
 
Meilleure réponse

Voici où j'en suis actuellement. Modifier le parametre capté dans l'url pour qu'il reçoive une liste variable d'entiers:

def get_urls(self):
    urls = super(PhotoModelAdmin, self).get_urls()
    custom_photo_urls = patterns('',
                                 # example: /en/admin/photo/photo/informations/23,24,25,98/
                                url(r'informations/(?P<photo_id>\d+(?:,(\d+))*)/$',
                                self.admin_site.admin_view(self.informations),
                                name='photo-informations'),)
    return custom_photo_urls + urls

def informations(self, request, photo_id):
    # retrieve comma separated list of ids
    photo_ids_list = [int(x) for x in photo_id.split(',')]
    json_data = []
    if request.is_ajax:
        for x in photo_ids_list:
            photo = get_object_or_404(Photo, id=x)
            json_data.append({'title': photo.title,
                            'description': photo.description,
                            'image': photo.image.url})
    else:
        json_data = {'error': "You're the lying type, I can just tell."}
    return JsonResponse(data=json_data, safe=False)
répondu 21-Mar-2015 par Nsukami_ (1,998 points)
sélectionné 21-Mar-2015 par Nsukami_
+3 votes

Actuellement tu passes ton argument photo_id en paramètre GET dans l'url.
Enlève ce paramètre de l'url pour le passer en POST, tu pourras ainsi passer une liste dans ton paramètre POST.

def get_urls(self):
urls = super(PhotoModelAdmin, self).get_urls()
custom_photo_urls = patterns('',
                            url(r'informations/$',                                    
                            self.admin_site.admin_view(self.informations),
                            name='photo-informations'),)
return custom_photo_urls + urls

def informations(self, request):
    json_data = []
    if request.is_ajax():
        if 'photo_ids' in request.POST:
            photo_ids = request.POST['photo_ids']
            for photo_id in photo_ids:
                photo = get_object_or_404(Photo, id=photo_id)
                json_data.append({'title': photo.title,
                          'description': photo.description,
                          'image': photo.image.url})
    else:
        json_data.append({'error': "You're the lying type, I can just tell."})
    return JsonResponse(data=json_data)

Ton html :

<input type="text" name="photo_id[]" value="3" />
<input type="text" name="photo_id[]" value="4" />
<input type="text" name="photo_id[]" value="5" />

Et ton javascript va être dans ce style

photo_ids = [];
$('input[name="photo_id[]"]').each(function() {
    photo_ids[] = $(this).val();
});

$.ajax({
   type: "POST",
   data: {csrfmiddlewaretoken:csrftoken, photo_ids:photo_ids},
   url: "informations/",
   success: function(data){
   }
});
répondu 20-Mar-2015 par Pierre G (146 points)

Le faire de cette maniere, suppose que le serveur passe d'abord un formulaire au client. Ce que j'aurais aimé eviter. J'aurais souhaité le faire via une requete GET, pour laisser mes utilisateurs "lire librement" ces informations depuis n'importe où. Je garde cette solution sous le coude, si rien d'autre ds les prochaines heures, je valide.

D'accord, je n'ai pas tout le contexte de ton problème
mais tu peux également mettre des champs hidden pour qu'il n'y ait rien à remplir

<input type="hidden" name="photo_id[]" value="3" />
<input type="hidden" name="photo_id[]" value="4" />
<input type="hidden" name="photo_id[]" value="5" />
...