4 votes

Django publications et réponses

Ceci est moins une question technique, plus une question de "est-ce que je fais cela de la bonne manière".

J'ai plusieurs modèles définis

class Style(models.Model):
    tag_xml = models.TextField()
    image = models.ImageField(upload_to="styles")
    user = models.ForeignKey(User)
    uploaded = models.DateField()

class StyleMatch(models.Model):
    style = models.ForeignKey(Style)
    item = models.ForeignKey(FashionItem)

Ils ne peuvent pas être populés via des formulaires html simplement en raison de la nature de la tâche, donc pour les peupler j'ai une page html avec jquery et beaucoup de fonctions d'événements et d'autres astuces javascript. Lorsque le bouton de sauvegarde est cliqué, j'appelle .ajax() et passe toutes les variables collectées

var saveRequest= $.ajax({
url: "/save_style/",  
type: "POST",        
data: "selection="+s+"&user="+user+"&src="+image_src,
dataType: "text"    
});

Mon vue save_style enregistre ensuite les valeurs dans le modèle

def save_style(request):
if request.method == 'POST':
    selection = request.POST['selection'].rsplit("|")
    user = request.POST['user']
    src = request.POST['src']

    f = open(MEDIA_ROOT+src)
    image_file = File(f)

    u = User.objects.get(id=user)

    style = Style(tag_xml = "",
                  image = image_file,
                  user = u,
                  uploaded = date.today())
    style.save()

    for s in selection:
        if (s != ''):
            match = FashionItem.objects.get(id=s)
            styleMatch = StyleMatch(style = style,
                                    item = match)
            styleMatch.save()

    i = StyleMatch.objects.filter(style=style)
    items = FashionItem.objects.filter(id__in=i)

   return render_to_response('style_saved.html', dict(image=src, items=items, media_url = MEDIA_URL), context_instance=RequestContext(request))

Après avoir fait cela, je veux vraiment aller sur une page de succès et afficher les enregistrements que je viens d'ajouter au modèle, cependant si j'utilise render_to_response et renvoie les détails du modèle, je dois reconstruire toute la page en javascript, il semble préférable de rediriger vers un nouveau modèle, mais si j'utilise HttpResponseRedirect a) je ne peux pas renvoyer des valeurs et b) il ne semble pas rediriger correctement (je pense que cela vient du fait que le post provient de mon javascript).

Donc enfin mes questions

  1. Est-ce vraiment comment je devrais faire cela? La documentation de django ne semble pas vraiment couvrir ces domaines légèrement plus compliqués, donc je suis un peu incertain.
  2. Devrais-je utiliser render_to_response ou HttpResponseRedirect ci-dessus? Ou peut-être une troisième option que je ne connais pas.

Toutes les suggestions sont appréciées.

Pour information, je sais que le code ci-dessus n'est pas idéal c'est-à-dire qu'il manque de validation, de commentaires... etc, il a simplement été fourni à des fins de démonstration. N'hésitez pas à signaler tout problème sérieux cependant.

1voto

patrickn Points 2295

En fonction de la nature de votre application, vous ne devriez probablement pas construire l'intégralité de vos pages avec JavaScript. Cependant, puisque nous en sommes déjà là, j'ai utilisé la solution suivante avec de bons résultats :

Envisagez de créer un "fragment" de modèle, comme je les appelle. C'est simplement un peu de HTML conçu pour être une capsule pour les données transférées via AJAX. Faites un render_to_response vers ce fragment, transmettez vos données de vue traitées en tant que variables, puis récupérez ces données via AJAX et utilisez JavaScript pour remplacer le HTML dans un élément div désigné par les données retournées.

Il y a quelques pièges avec la solution ci-dessus, comme le stylage et la fixation des gestionnaires d'événements sur le fragment de modèle, mais cela devrait au moins vous faire avancer. Juste un conseil à ce sujet, familiarisez-vous avec .on() de jQuery.

0voto

ilvar Points 3456

transmettre toutes les variables collectées

Pourquoi ne pas utiliser $(form).serialize()?

sauve les valeurs dans le modèle

Pourquoi ne pas utiliser django.forms.ModelForm (ou quelques-uns)?

ne semble pas rediriger correctement

Parce que les redirections en AJAX sont traitées dans l'appel AJAX et n'affectent pas la page ouverte à moins de traiter les données reçues en JS d'une manière ou d'une autre.

De plus, vous n'avez pas de validation des données et/ou de rapport d'erreurs, c'est mauvais. En fait, ModelForm devrait vous aider énormément à cet égard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X