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.py
にsuccess_url
の変数にアクセスするにはどうすればよいですか。 これは非常に基本的なもの(うまくいけば)だと思うし、Pythonでスコープがどのように機能するのか分からないと思う。
私は質問を更新しました。views.pyを見てください。 – oldsport
ListViewのsuccess_url属性またはget_success_url()メソッドはありません。したがって、 'render_to_response(self、context、** response_kwargs)'をオーバーライドして、あなたのURLにHttpResponseRedirectを提供することもできます。コンテキストデータも提供しています – cutteeth