【发布时间】:2016-11-07 10:30:50
【问题描述】:
在ListView 中,我使用带有paginate_by = 5 的Paginator 渲染表格。
在每一行中,我都有一个打开UpdateView 的按钮。
成功更新后,我回到了我的ListView,但总是在第一页。
如何更改success_url,以便我回到打开UpdateView 的页码?
Django 中是否有适当的方法来解决这个问题?
#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 模板中我扩展了Url...
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
...但是现在...如何在success_url 中访问views.py 中的变量page?
我认为这是非常基本的东西(希望如此),我想我不明白范围在 Python 中是如何工作的。
【问题讨论】:
-
我更新了我的问题,看看views.py。
-
ListView 没有 success_url 属性或 get_success_url() 方法。所以你可以覆盖
render_to_response(self, context, **response_kwargs),然后用你的url提供一个HttpResponseRedirect,你也可以提供上下文数据