2016-11-07 55 views
1

ListView我使用分頁符與paginate_by = 5呈現表。 在每一行我都有一個按鈕,打開UpdateView。 成功更新後,我回到了我的ListView,但始終在第一頁上。 如何更改success_url以便我回到頁碼上,從那裏打開UpdateView? 在Django中有沒有正確的方法來解決這個問題?Django分頁 - 如何重定向回到ListView和頁碼

#views.py 

class Orders_list(ListView): 
    model = Order 
    context_object_name = "orders" 
    queryset = Order.objects.all() 
    paginate_by = 5 
    template_name = "orders/orders_list.html" 

#http://127.0.0.1:8000/orders/?page=4 


class Orders_update(UpdateView): 
    model = Order 
    form_class = Order_UpdateForm 
    template_name = "orders/orders_update.html" 
    #success_url = '../../../orders/' 
    success_url = reverse_lazy('orders') 


#urls.py 

urlpatterns = [ 
    url(r'^orders/$', Orders_list.as_view()), 
    url(r'^orders/detail/(?P<pk>\d+)/$', Orders_detail.as_view()), 
] 


#forms.py 

class Order_UpdateForm(forms.ModelForm): 
    class Meta: 
     model = Order 
     fields = ['order_text', 'customer', 'cyclist'] 

    def __init__(self, *args, **kwargs): 
     super(Order_UpdateForm, self).__init__(*args, **kwargs) 
     self.fields['cyclist'].queryset = Cyclist.objects.filter(active=True) 


#models.py 

class Order(models.Model): 
    customer = models.ForeignKey('Customer') 
    cyclist = models.ForeignKey('Cyclist') 
    order_text = models.CharField(max_length=200) 
    pick_up = models.CharField(max_length=200) 
    destination = models.CharField(max_length=200) 
    created_date = models.DateTimeField(default=timezone.now) 
    changed_date = models.DateTimeField(blank=True, null=True) 

    def created(self): 
     self.changed_date = timezone.now() 
     self.save() 

    def __str__(self): 
     return self.order_text 


class Customer(models.Model): 
    company_name = models.CharField(max_length=200) 
    created_date = models.DateTimeField(default=timezone.now) 
    changed_date = models.DateTimeField(blank=True, null=True) 

    def created(self): 
     self.changed_date = timezone.now() 
     self.save() 

    def __str__(self): return self.company_name 


class Cyclist(models.Model): 
    lastname = models.CharField(max_length=20) 
    firstname = models.CharField(max_length=20) 
    created_date = models.DateTimeField(default=timezone.now) 
    changed_date = models.DateTimeField(blank=True, null=True) 
    active = models.BooleanField(default=True) 

    def created(self): 
     self.changed_date = timezone.now() 
     self.save() 

    def __str__(self): 
     return self.lastname 

更新

我找到了一種方法來解決這個(可能)。但我仍然錯過了一些東西。

我做了什麼至今:

ListView模板我伸出網址...

window.open("{{ request.path }}update/" + id + "/?page=" + {{ page_obj.number }}); 

...然後在視圖中我已改寫了get_context_data方法...

#views.py 

class Orders_update(UpdateView): 
    model = Order 
    form_class = Order_UpdateForm 
    template_name = "orders/orders_update.html" 
    page = "1" # Assigned 

    def get_context_data(self, **kwargs): 
     context = super(Orders_update, self).get_context_data(**kwargs) 
     page = self.request.GET.get('page') # Modified 
     return context 

    success_url = '../../../orders/?page=' + str(page) # Should be used here to redirect to a specific page on a ListView 

...但是現在...我怎樣才能訪問變量pageviews.pysuccess_url? 我認爲這是非常基本的東西(希望),我想我不明白範圍是如何在Python中工作的。

+0

我更新了我的問題,看看views.py。 – oldsport

+0

ListView沒有success_url屬性或get_success_url()方法。所以你可以重寫'render_to_response(self,context,** response_kwargs)',然後爲你的url提供一個HttpResponseRedirect,同樣你也提供了上下文數據 – cutteeth

回答

1

這是最終爲我工作的。基本上我只是覆蓋get_success_url以訪問請求中的page參數。

class Orders_update(UpdateView): 
    model = Order 
    form_class = Order_UpdateForm 
    template_name = "orders/orders_update.html" 

    def get_success_url(self): 
     global page 
     page = self.request.GET.get('page') 
     return reverse_lazy('orders')