2016-11-07 10 views
1

ListViewでは、Paginatorを使用して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 

更新

私は(かもしれない)これを解決する方法を見つけました。しかし、私はまだ何かが欠けている。その後、ビューに、私はget_context_dataメソッドを上書き

私はURLを拡張ListViewテンプレートで...

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

... ...

:私はこれまでやった

#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 

...今のところ... のviews.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') 
関連する問題