2010-08-24 6 views
4

J'ai vue comme ceci:modèle Actualiser dans Django

def form1(request): 
    if request.method == 'POST': 
     form = SyncJobForm(request.POST) 
     if form.is_valid(): 
     # do something 
     in_progress = True 
     return render_to_response('form1.html', {'in_progress': in_progress}) 

Je voudrais savoir comment il mis à rafraîchir le modèle après est fait avec le processus de vue. Comme rendre la page après son fait:

 in_progress = True 
     return render_to_response('form1.html', {'in_progress': in_progress}) 
     # after its finished 
     finished = True 
     return render_to_response('form1.html', {'finished': finished}) 

Comment puis-je mettre en œuvre quelque chose comme ça? Merci d'avance.

+0

Pourquoi avez-vous besoin de cela? –

+0

Avez-vous envisagé de rediriger l'utilisateur vers une page "terminée" une fois celle-ci terminée? –

+0

La forme synchronise fondamentalement 2 clusters. J'ai 4 utilisateurs connectés, donc je veux bloquer le formulaire une fois qu'un utilisateur l'a soumis afin que personne ne puisse y accéder pendant la synchronisation. –

Répondre

2

Vous ne pouvez pas gérer l'état entre les appels de pages sur une base globale. Vous devez donc stocker vos données dans la base de données. En outre, une vue ne peut rien négocier avec le navigateur après le renvoi d'une page. Vous devez donc scinder cette vue en plusieurs vues et générer un thread distinct pour le travail. Voici un aperçu général qui pourrait aider:

def do_something(): 
    my_job = Jobs.get(id=blah) 
    my_job.in_progress = True 
    my_job.save() 

    # Do some stuff here.... 

    my_job.in_progress = False 
    my_job.save() 

def step1(request): 
    in_progress = Jobs.get(id=blah).in_progress 
    if not in_progress: 
     if request.method == 'POST': 
      form = SyncJobForm(request.POST) 
      if form.is_valid(): 
       thread.start_new_thread(do_something) 
       return HttpResponseRedirect(step2) 
      else: 
       return render_to_response('form.html', 'form': form) 
     else: 
      form = SyncJobForm() 
      return render_to_response('form.html', 'form': form) 
    else: 
     return HttpResponseRedirect(step2) 

def step2(request): 
    in_progress = Jobs.get(id=blah).in_progress 
    if in_progress: 
     return render_to_response('in_progress.html') 
    else: 
     return HttpResponseRedirect(finished) 

def finished(request): 
    return render_to_response('finished.html') 

Testez ensuite votre page in_progress.html rafraîchir régulièrement la page. Lorsque le travail est terminé, vous pouvez afficher un message d'état dans finished.html.

Il existe des méthodes plus sophistiquées pour cela (écrire Javascript pour interroger le serveur périodiquement), mais vous aurez encore besoin d'écrire des vues séparées pour répondre avec les informations appropriées. En outre, vous pouvez utiliser un cadre de gestion des travaux tel que Celery pour créer et exécuter des tâches, mais vous devrez créer des vues distinctes pour gérer les informations d'état.

+0

Merci. J'ai décidé d'opter pour cette approche redirigeant l'utilisateur vers une autre page une fois le formulaire soumis et une fonction de sondage pour vérifier l'état. –

0

Je ne suis pas capable de penser à le faire sans une sorte de rappel du client (sauf si vous utilisez un mécanisme de serveur asynchrone, quelque chose que je ne connais pas). Une façon serait que le client interroge périodiquement le serveur après avoir reçu la notification "in_progress" pour voir si le traitement est terminé. Le côté serveur peut être divisé en deux appels, d'abord pour gérer le POST comme indiqué dans votre question et un autre pour savoir et signaler si une tâche donnée est terminée.