2012-07-02 7 views
5

Python Piramit uygulamasında bazı HTML formlarım var. JavaScript etkinleştirildiğinde ve JavaScript devre dışı olduğunda AJAX aracılığıyla çalışmasını isterim. Artık AJAX ve normal form yazıları için farklı görünümler kullanıyorum, ancak kod, bu işlevler için yanıt dışında hemen hemen aynı görünüyor. Ben eğer varsa hatayı işlemek ve html bunları göstermek gerekirAjax/html formunu işlemek için Python Piramit görünümlerini nasıl birleştirir POST'lar

def ajax_ok(self, msg): 
    return Response(body=msg) 

def ajax_error(self, msg): 
    return HTTPInternalServerError(body=msg) 

@action(xhr=True, renderer='json', name='ftp') 
def ftp_ajax(self): 
    log.debug('View: %s', 'ftp (ajax)') 
    if 'form.submitted' in self.params: 
     try: 
      self.config.save(self.params) 
     except: 
      return self.ajax_error('some error') 
     else: 
      return self.ajax_ok('ok') 

@action() 
def ftp(self): 
    if 'form.submitted' in self.params: 
     try: 
      self.config.save(self.params) 
     except: 
      self.request.session.flash('error; ' + msg) 
     else: 
      self.request.session.flash('success; ' + msg) 
    return {'content': render('templates/ftp.pt', {'ftp': 
                self.config.ftp})} 

: Bu (sınıf gövdesinin) gibi görünüm sınıfını kullanın. Belki farklı istek tipi için farklı yanıt gönderecek olan finished_callback veya kendi işleyicim kullanmalıyım?

+0

Sadece 4 kod yolunun sadece 1 tanesi aynı gibi görünüyor, bu yüzden birleştirmeyi umduğunuzdan emin değilim. "Kaydet" işlevinin tümünü ortak bir yerde ele alacak kadar iyi olduğunu ve hataların bağımsız olarak işlenmesini sağladığını söyleyebilirim. –

cevap

4

Böyle bir şey yapabilirsiniz:

@action(name='ftp', renderer='templates/ftp.pt') 
@action(xhr=True, renderer='json', name='ftp') 
def ftp_ajax(self): 
    log.debug('View: %s', 'ftp (ajax)') 

    # CODE 

    if request.is_xhr: 
     return JSON 
    else: 
     return something for template 

Ama gerçekten harika yaparsanız böyle bir şey olabilir:

@action(name='ftp', renderer='templates/ftp.pt') 
@action(xhr=True, renderer='json', name='ftp') 
def ftp_ajax(self): 
    log.debug('View: %s', 'ftp (ajax)') 
    my_values = dict() 

    # Code 

    return my_values 

ancak mevcut kod, kod değil mi dürüst olmak Aynı şeyleri iade etmediğinizden beri çok benzer ve bir durumda, bir kaç kez yanıp sönmeye çalışıyorsunuz ve ikincisinde bazı şeyleri geri getiriyorsunuz.

Bu durumda, her şeyi bir arada tutmak, her şeyi bir arada tutmaktan daha iyidir. Ancak aynı verileri ayırıp geri gönderirseniz, @action'u birlikte yığınlayabilirsiniz.

+0

Çözümünüzü beğendim ama şimdi 2 sorun yaşadım ve ikincisi, görünümlerdeki istisnaların nasıl yönetileceğidir (aynı durumda - html ve AJAX formları gönderirken). – marcinpz

+0

İstismarı yükseltmek veya istisnaları geri getirmek yerine bunun gibi bir şey kullanabilirsiniz. dict (tamam = False, message = "error message") 'bir hata ve' dict (d = true, content = dict (...)) ' –

+0

derken json rendererin doğru bir şekilde oluşturduğuna dikkat edin. teftiş yapabilir ve şablon da bu değerleri kullanabilir. Tamam ve is.xhr için kontrol edecek ve gereken mesajla birlikte bir istisna atacak bir beforerender olayı ekleyebileceğinizden eminim. Bu en iyisi olmayabilir ama orada –

0

sadece bir yöntem ftp varsa ve bunun içinde request.is_xhr doğru hata/yanıtını işlemek için doğru olup olmadığını kontrol edebilir.

İlgili konular