2012-01-19 13 views
9

ile yönlendirir.Django Python ve django için yeni ve i yönlendirme işlevi ile ilgili bir sorum var kwarg

Bu benim views.py dosyasının bir azalma versiyonu.

def page_index(request, error_message=''): 
    print error_message 

def add_page(request): 
    return redirect('page_index') # this work fine 
    return redirect('page_index', error_message='test') # this does not work 

Ve burada benim urls.py kısa bir versiyonudur

i her şey çalışıyor kelime argüman olmadan PAGE_INDEX yönlendirme yaptığını ancak deneyin
urlpatterns = patterns(
    'x.views', 
    url(r'^$', 'page_index', {'error_message': 't'}, name='page_index'), 
    url(r'^add/$', 'add_page', name='add_page'), 
) 

i kwag kullandığınızda i aşağıdaki hatayı alıyorum mesajı: sayfaların/at

NoReverseMatch/argümanlarla 'PAGE_INDEX' için/

Ters eklemek '()' bir d anahtar kelime argümanları '{' error_message ':' test '}' bulunamadı. ben yanlış yapıyorum

?

cevap

10

Kısa cevap: 'hata_iletisi' anahtar kelimesi için Url'nizde düzeninde yer yoktur.

uzun cevap:

yönlendirme() işlevi, bir URL oluşturmak için ters() 'ı çağırarak olduğu; 302 yönlendirme durum kodu ve yeni url ile bir HTTP yanıtı döndürerek kullanıcının tarayıcısını bu URL'ye gönderecek. Reverse() için sağladığınız herhangi bir anahtar kelime argümanının, URL'nin bir parçası olarak sona ermesi gerekir. Bu, kullanıcıya nasıl iletilir.

Sizin de durumunuzda, 'page_index' için url '^ $' olarak tanımlanmıştır - bu, tarayıcıda 'http://yoursite.com/' gibi görünen kök URL'dir. Eğer diğer bilgileri içeren bir yönlendirme verebiliriz istiyorsanız

, sen url bunun için bir yer tanımlamak veya farklı bir şekilde eklemek gerekir.

İki üç yolu bunun için oldukça yaygındır:

  1. bir sorgu parametresi kullan - Bunu açıkça müşteriye mesajı gönderir; Dikkatli değilseniz, insanlar dizin sayfanızı istedikleri her şeyi söyleyecek url üretebilirler.

    return redirect(reverse('page-index')+"?error_message=test")) 
    
  2. Stash mesajı oturumunda ve ne zaman bir sonraki sayfa yüklendiğinde çekin - Bu oturumların yapılandırmış olmanız gerekir, ve oldukça istemci güvenmek yerine, sunucu tarafında her şeyi izler - Bu ad-hoc oturumu özelliklerini daha fazla tercih edilir, sürece üzerinde mesajın çok fazla 'tiplerini' gerekmez olarak

    def add_page(request): 
        request.session['error_message'] = 'test' 
        return redirect('page-index') 
    
    def page_index(request): 
        print request.session.get('error_message','') 
    
  3. Bunun mesajlar çerçevesini kullanın: hata mesajı size geri göndermek aynı sayfa.Sahip tüm hata mesajı şablonunda bir boşluk olması durumunda, yine de, o zaman bu gerçekten kolaydır: Baz şablonunda sonra

    from django.contrib.messages import error 
    
    def add_page(request): 
        error(request, 'test') 
        return redirect('page-index') 
    

    Ve bundan daha büyük olasılıkla daha karmaşık bu yerde (örneğin bir blok var; tarz hatta):

    {% for message in messages %} 
        <p>{{ message }}</p> 
    {% endfor %} 
    

her iki tüm vakalar olsa da, size urls.py gelen argümanlar kaldırabilirsiniz - mesajın kendisi yolu bileşeninin parçası olacak değil URL.

urlpatterns = patterns(
    'x.views', 
    url(r'^$', 'page_index', name='page_index'), 
    url(r'^add/$', 'add_page', name='add_page'), 
) 
+0

bilgi içeren bir görünüm aramak için bir yol yoktur url thats? – Justus1

+0

Evet, bunu Python'da yapıyorsunuz - sadece add_page görünümünüzden bir 'return page_index (error_message = 'test')' yapın. –

+1

ancak bunu yaparsanız URL değişmezse, başka bir görünümün içeriğini (page_index) geçerli görünüme (add_page) döndürdünüz. Ayrıca, kendi oturum tabanlı mesajlaşma çözümünü kullanmak yerine, Django'nun yerleşik [mesajlar çerçevesi] (https://docs.djangoproject.com/en/1) kullanmanızı öneririz.3/ref/contrib/messages /) – Anentropic

0

redirect gerçek url (bir HTTP yönlendirmesi değil, sadece bir Python çağrısı) yönlendirmek zorundadır.

Url conf'inizde 'error_message' segmenti yoktur, ancak varsayılan olarak işlevi işlevinin bir kwarg olarak error_message ile çağrılması için ayarlanmıştır.

Bu, dizin sayfanız olduğundan ve muhtemelen URL'ye fazladan yol segmentleri eklemek istemiyorsanız, bunu GET vars ile kesebilirsiniz. örneğin

def page_index(request): 
    if 'error_message' in request.GET: 
     print request.GET['error_message'] 

from django.core.urlresolvers import reverse 

def add_page(request): 
    return redirect('%s?error_message=test' % reverse('page_index')) 

urlpatterns = patterns(
    'x.views', 
    url(r'^$', 'page_index', name='page_index'), 
    url(r'^add/$', 'add_page', name='add_page'), 
) 

güncelleme: Sorunuzun yönlendirme ve kwargs vb ait olduğu halde Eve yürürken bu düşünmek

, burada tartışmasız daha iyi bir seçenek Django en messages framework kullanmak ve tamamen error_message bırakmak olurdu görünümünüzü kwargs dışında, GET vb değişkenler

örn

from django.contrib import messages 

def add_page(request): 
    messages.add_message(request, messages.ERROR, 'test') 
    return redirect('page_index') 

Bu ayrıca, kullanıcıların kendi kendilerine yapılmış hata iletilerinde URL'leri üretebilmelerini engeller ve bu da güvenlik riski oluşturabilir.

2

Ya could her hata iletisi için adlandırılmış URL kalıbının oluşturmak ve bu gibi args dict geçmek:

url(r'^$', 'page_index', {'error_message': 'test'}, name='test_page_index'), 

veya gerçek url hata mesajı koymak için istekli olup olmadığını Bu tercih olabilir:

url(r'(?P"<"error_message">"\w+)/^$', 'page_index', name='page_index'), 

("<" ve ">" "etrafında" KALDIR LÜTFEN, ben bir benzeyen şeyi tahmin parantez içinde bunları koymak zorunda yoksa formu cevabını hariç tutuluyordu html etiketleri filtrelenmiştir)

ve görünümde:

return redirect(reverse('page_index', args=['test']))