2009-08-30 31 views
25

Ai đó có thể giải thích cách bạn có thể viết mẫu url và chế độ xem cho phép tham số tùy chọn không? Tôi đã thực hiện thành công, nhưng tôi luôn phá vỡ thẻ mẫu url.Tùy chọn lấy thông số trong django?

Dưới đây là những gì tôi hiện có:

Pattern

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

Xem

def so(request, required, optional): 

Nếu tôi sử dụng url mẫu thẻ trong ví dụ này cung cấp cả hai lập luận, nó hoạt động bình thường; tuy nhiên, nếu tôi bỏ qua đối số tùy chọn, tôi sẽ nhận được lỗi đảo ngược.

Tôi làm cách nào để thực hiện việc này?

Cảm ơn, Pete

+1

Nó đang trên lộ trình cho 1,3: http://code.djangoproject.com/ticket/14772 –

Trả lời

37

tôi thường thực hiện hai mô hình với một named url:

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

Vâng, đây là cách thông thường để làm điều đó. Trình đảo ngược URL chỉ giới hạn các thông tin khéo léo về các regex (nó không thực hiện một trình phân tích cú pháp regex đầy đủ) và nó không thể xử lý các phần tùy chọn. Bạn được tự do sử dụng toàn bộ sức mạnh của các regex trong các mẫu URL của mình, nhưng sau đó bạn từ bỏ việc đảo ngược URL. –

+0

Cảm ơn, đây là những gì tôi đang tìm kiếm. Thật ngạc nhiên khi biết tôi cần hai URL riêng biệt. – slypete

+9

Câu trả lời hay. Nhưng một chút thất vọng ... – Joe

1

Tại sao không có hai mẫu:

(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'), 
+0

Việc bạn đặt các mẫu URL này vào bất kỳ thứ tự nào đều không quan trọng. Cả hai đều bị ràng buộc với $ ở cuối, do đó không thể có sự mơ hồ.Tất nhiên, có những tình huống tương tự mà nó sẽ quan trọng (ví dụ, nếu kiểu ngắn hơn không bị ràng buộc). –

+0

Hmmmm. Sẽ chỉnh sửa. – hughdbrown

5

Những người khác đã chứng minh cách để xử lý này với hai mẫu URL được đặt tên riêng biệt. Nếu sự lặp lại của một phần của mẫu URL phiền bạn, nó có thể để thoát khỏi nó bằng cách sử dụng bao gồm():

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

Và sau đó thêm một tập tin required_urls.py với:

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

thường Tôi sẽ không xem xét điều này giá trị nó trừ khi có một tiền tố phổ biến cho một số lượng khá nhiều URL (chắc chắn hơn hai).

+0

Cảm ơn Carl, điều này có vẻ như nó sẽ có ích quá. – slypete

+0

bạn có thể sử dụng 'mẫu' để lưu phải tạo tệp mới:' url (r '...', bao gồm (mẫu ('', url (...), url (...)))) ' . [Xem tại đây] (https://docs.djangoproject.com/en/dev/topics/http/urls/#including-other-urlconfs) – Patrick

-1

trong views.py bạn làm điều đơn giản.

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

Và khi bạn không nhận được tùy chọn param trong chuỗi url nó sẽ None trong mã của bạn.

đơn giản và thanh lịch :)

+0

Phiên bản Django nào hoạt động? Tôi đã 1,5 điều này không làm việc mà không có thay đổi trong url.py –

+0

Điều này làm việc cho các phương thức views.py. Và nó là khá khấu hao kể từ khi Django thay đổi rất nhiều thứ về quản lý URL và áp dụng quan điểm. [ví dụ. Chế độ xem dựa trên lớp học]; – Popara

+0

Bạn không thể làm điều đó trong django, nó đầu tiên nhìn vào 'url.py' & sẽ không tìm thấy bất kỳ mẫu nào phù hợp với url. Vì điều này đang ở trong 'views.py' và sẽ không chạy cho đến khi một mẫu được tìm thấy –

17

url Django là đa hình:

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

obious của nó mà bạn phải thực hiện quan điểm của bạn như thế này:

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

để bạn có thể gọi nó với cùng tên và nó sẽ làm việc tốt hơn.Tuy nhiên cần lưu ý rằng bạn không thể vượt qua Không như là đối số cần thiết và hy vọng rằng nó sẽ giúp bạn có được những regexp mà không cần đối số:

sai:

{% url sample_view required optional %} 

Đúng:

{% if optional %} 
    {% url sample_view required optional %} 
{% else %} 
    {% url sample_view required %} 
{% endif %} 

Tôi không biết liệu đây có phải là tài liệu ở bất kỳ đâu - tôi đã phát hiện ra nó một cách tình cờ - tôi quên viết lại tên url và nó vẫn đang hoạt động :)

1

Đối với bất kỳ ai vẫn gặp sự cố này. Tôi sử dụng Django 1.5 (cập nhật: sử dụng 1.8) và nó vẫn hoạt động tốt.

tôi sử dụng:

urls.py

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

Sau đó, khi tôi muốn có hai url

/1/start/2 

/1/start 

Tôi sử dụng:

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

này sẽ tạo ra các url

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

Nếu bạn tạo một url bằng tay bạn phải giữ/trong tâm trí.

Tôi giúp điều này giúp mọi người!

-2

Tùy thuộc vào trường hợp sử dụng, bạn có thể đơn giản chỉ muốn vượt qua một tham số url như vậy:

url/?parameter=foo 

cuộc gọi này theo quan điểm của bạn:

request.REQUEST.get('parameter') 

này sẽ trở lại 'foo'

+0

Câu hỏi của tôi liên quan đến việc chuyển tham số tùy chọn tới hàm xem cũng như sử dụng nó với thẻ mẫu url. – slypete

Các vấn đề liên quan