2009-08-30 23 views
25

Birisi, isteğe bağlı parametrelere izin veren bir url kalıbı ve görünümü nasıl yazabileceğinizi açıklayabilir mi? Bunu başarıyla yaptım, ancak her zaman url şablon etiketini kırdım. İşte İsteğe bağlı django parametrelerini aldınız mı?

var Şu anda ne var:

Desen

(r'^so/(?P<required>\d+)/?(?P<optional>(.*))/?$', 'myapp.so') 

Görünüm ben hem argümanlar sağlayan bu örnekte url şablon etiketi kullanırsanız

def so(request, required, optional): 

, çalışıyor sadece iyi; Ancak, isteğe bağlı argümanı çıkarırsam, tersine bir hata alıyorum.

Bunu nasıl yapabilirim?

sayesinde Pete

Ben genellikle named url iki desen yapmak
+1

1.3: http://code.djangoproject.com/ticket/14772 –

cevap

37

:

(r'^so/(?P<required>\d+)/(?P<optional>.*)/$', view='myapp.so', name='optional'), 
(r'^so/(?P<required>\d+)/$', view='myapp.so', kwargs={'optional':None}, name='required'), 
+2

için yol haritası üzerindedir. Evet, bunu yapmak için her zamanki yol. URL-reverser, regeeksler hakkında yalnızca sınırlı zekalara sahiptir (tam bir regex çözümleyici uygulamamaktadır) ve isteğe bağlı parçaları işleyemez. URL kalıplarınızdaki regex'lerin tam gücünü kullanmakta serbestsiniz, ancak daha sonra URL'yi ters çevirmekten vazgeçersiniz. –

+0

Teşekkürler, aradığım şey buydu. İki ayrı URL'ye ihtiyacım olduğunu öğrendiğimde şaşırdım. – slypete

+9

Güzel cevap. Ama biraz bunaltıcı ... – Joe

1

Neden iki desen yok iki ayrı adlandırılmış URL modeli.

url(r'^so/(?P<required>\d+)/', include('myapp.required_urls')) 

Sonra bir required_urls.py dosyası eklemek:

url(r'^$', 'myapp.so', name='something') 
url(r'^(?P<optional>.+)/$', 'myapp.so', name='something_else') 

Normalde URL modelinden kısmının tekrarı seni rahatsız ediyorsa, bu) (dahil kullanarak bundan kurtulmak mümkün Çok sayıda URL için ortak bir önek olmadığı sürece buna değmez (kesinlikle ikiden fazla).

+0

Bu URL kalıplarını hangi sıraya koyduğunuz önemli değil. Her ikisi de sonunda $ ile sınırlandırıldı, bu nedenle hiçbir belirsizlik olmayabilir.Elbette, önemli olan durumlarda benzer durumlar vardır (örneğin, kısa örüntü sınırsız ise). –

+0

Hmmmm. Düzenleyecek – hughdbrown

5

Diğerleri ile bu işlemek için bir yol göstermiştir:

url(r'^so/(?P<required>\d+)/$', 'myapp.so', name='something'), 
url(r'^so/(?P<required>\d+)/(?P<optional>.*)/$', 'myapp.so', name='something_else'), 
+0

Teşekkürler Carl, bu da kullanışlı olacak gibi görünüyor. – slypete

+0

“yeni desenler” oluşturmayı kaydetmek için 'patterns' kullanabilirsiniz: url (r '...', include (patterns ('', url (...), url (...)))) . [Buraya bakın] (https://docs.djangoproject.com/en/dev/topics/http/urls/#including-other-urlconfs) – Patrick

-1

views.py'de basit bir şey yaparsınız.

def so(request, required, optional=None): 

Ve url dizesinde opsiyonel param alamıyorken o kodunuzda Yok olacaktır.

Basit ve :) zarif

+0

Django'nun hangi sürümü çalışır? Ben 1.5 bu url.py –

+0

değişiklikleri olmadan çalışmaz. Bu, views.py yöntemleri için çalışır. Django, URL yönetimi ve görünüm uygulama açısından birçok şeyi değiştirdiği için oldukça değer kaybetti. [Örneğin. Sınıf tabanlı görünümler]; – Popara

+0

Bunu django'da yapamazsınız, ilk önce 'url.py'ye bakın ve url ile eşleşen herhangi bir desen bulamaz. Bu, "view.py" öğesinde olduğu gibi ve bir desen buluncaya kadar çalışmayacak. –

17

Django URL'ler polimorfik şunlardır:

def sample_view(request, required, optional = None): 

böylece onu arayabilirsiniz: Eğer böyle görüşlerinizi yapmak zorunda olduğunu

url(r'^so/(?P<required>\d+)/$', 'myapp.so', name='sample_view'), 
url(r'^so/(?P<required>\d+)/(?P<optional>.*)/$', 'myapp.so', name='sample_view'), 

onun obious aynı isim ve iş url resolver iyi çalışırdı.

Yanlış:

{% url sample_view required optional %} 

Doğru:

{% if optional %} 
    {% url sample_view required optional %} 
{% else %} 
    {% url sample_view required %} 
{% endif %} 
Gerekli argüman olarak Yok'u geçmek ve argüman olmadan regexp sizi almasını bekliyor cant Ancak farkında

Bunun herhangi bir yerde belgelenip belgelenmediğini bilmiyorum - kazayla keşfettim - url isimlerini yeniden yazmayı unuttum ve zaten çalışıyordu :)

1

Bu sorunu hala yaşayan herkes için. Django 1.5 kullanıyorum (güncellendi: 1.8 kullanarak) ve hala çalışıyor.

kullandığım:

url(r'^(?P<app_id>\d+)/start/+(?P<server_id>\d+)?', views.restart, name='restart') 

Sonra

urls.py İki URL'ler sahip istediğinizde

/1/start/2 

ve

/1/start 

Ben kullanın: Eğer aklınızda/tutmak zorunda elle url oluşturursanız

{% url '<namespace>:start' app.id %} 
{% url '<namespace>:start' app.id server.id %} 

Bu URL'ler

/1/start/2 and 
/1/start/ <- notice the slash. 

yaratacaktır.

Bu, herkese yardımcı olur!

-2

kullanımı durumda bağlı olarak, basitçe şöyle bir URL parametresi geçirmek isteyebilirsiniz: senin görünümünde

url/?parameter=foo 

çağrıyı bu:

request.REQUEST.get('parameter') 

bu

'foo' dönecektir
+0

Soruma, isteğe bağlı parametreyi görüntüleme işlevine geçirmenin yanı sıra URL şablonu etiketi ile kullanmakla ilgiliydi. – slypete