2012-06-14 32 views
24

Tôi làm cách nào để đặt success_url dựa trên thông số?
Tôi thực sự muốn quay trở lại nơi tôi đến, không phải một nơi tĩnh. Trong mã giả:success_url trong UpdateView, dựa trên giá trị đã vượt qua

url(r'^entry/(?P<pk>\d+)/edit/(?P<category>\d+)', 
    UpdateView.as_view(model=Entry, 
         template_name='generic_form_popup.html', 
         success_url='/category/%(category)')), 

Điều này có nghĩa là: mục chỉnh sửa pk và sau đó quay lại 'danh mục'. Ở đây một mục có thể là một phần của nhiều danh mục.

Trả lời

42

Tạo một MyUpdateView lớp kế thừa từ UpdateView và ghi đè phương pháp get_success_url:

class MyUpdateView(UpdateView): 
    def get_success_url(self): 
     pass #return the appropriate success url 

Ngoài ra tôi muốn vượt qua các thông số như vậy như TEMPLATE_NAME và mô hình bên trong xem lớp kế thừa, nhưng không phải trong .as_view() trong url. py

+0

Các tham số (ví dụ: id và danh mục) ở đâu? – Bryce

+0

Chúng nằm trong self.kwargs –

0

Tại sao bạn không thêm tham số 'tiếp theo' vào biểu mẫu (mẫu) của bạn và bắt nó trong chế độ xem của bạn. Đó là thực tế phổ biến để đạt được chuyển hướng theo cách này.

+0

Làm cách nào để nắm bắt điều đó? Bạn có thể cung cấp mã không? – Bryce

20

Có cùng vấn đề. Đã có thể lấy nhân vật quan trọng từ self.kwargs như Dima đã đề cập:

def get_success_url(self): 
     if 'slug' in self.kwargs: 
      slug = self.kwargs['slug'] 
     else: 
      slug = 'demo' 
     return reverse('app_upload', kwargs={'pk': self._id, 'slug': slug}) 
+0

Điều này rất hữu ích cho tôi - mặc dù tôi cần đảm bảo rằng con sên bắt đầu bằng "/", nếu không tôi đã nhận được url như "/ formpage/successurl/successurl/successurl /" cuối cùng, thay vì bắt đầu. – JayCrossler

+0

@JayCrossler - Tôi nghĩ rằng đó là do địa chỉ tương đối so với địa chỉ tuyệt đối. Dấu gạch chéo hàng đầu ngụ ý rằng url bắt đầu ở đó. Nếu không có dấu gạch chéo, nó sẽ được nối vào url trước đó, Giống như đường dẫn unix với lệnh ls. –

+2

Có thể đơn giản hơn bằng cách sử dụng .get(): slug = self.kwargs.get ('slug', 'demo') –

0

Xác định get_absolute_url(self) trên mẫu của bạn. Ví dụ

class Poll(models.Model): 
    question = models.CharField(max_length=100) 
    slug = models.SlugField(max_length=50) 
    # etc ... 

    def get_absolute_url(self): 
     return reverse('poll', args=[self.slug]) 

Nếu PollUpdateView(UpdateView) của bạn tải một thể hiện của mô hình đó như object, nó sẽ bằng giao diện mặc định cho một phương pháp get_absolute_url() để tìm ra nơi để chuyển hướng đến sau khi POST. Sau đó,

url(r'^polls/(?P<slug>\w+)/, UpdateView.as_view(
    model=Poll, template_name='generic_form_popup.html'), 

nên làm.

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