如何 reverse_lazy 到带有变量的 view/url ?
How to reverse_lazy to a view/url with variable?
我有一个 DeleteView
用于从模型中删除 objects。它是通过 table 中的按钮启动的。它工作正常。
class DeleteAssignment(DeleteView):
model = Assignment
success_url = reverse_lazy('company')
我只想拥有它 return 到它 parent 对成功的看法。我目前将其重定向到 parent 的 parent (company
),因为此视图不需要变量。这很简单,但是 parent 视图需要一个变量 farm_id
来呈现,这是从 url 中捕获的,例如“/farm/18”
url(r'^farm/(?P<farm_id>.+)', views.farm, name='farm'),
我已经用页面上的表单解决了这个问题,方法是让它们使用变量 farm_id
.
重定向到视图 farm
return redirect(farm, farm_id=farm_id)
如何使用 success_url
为我的 DeleteView
执行此操作?
尼基的例子:
views.py
@login_required
def farm(request, farm_id=None):
user = request.user
company_id = user.profile.company_id
farm_id = farm_id
farm_filter = Farm.objects.filter(farm=farm_id)
farm_current = farm_filter[0]
# farm_company =
serial_filter = Sensor.objects.filter(assignment__farm__company_id__isnull=True)
assignment_filter = Assignment.objects.filter(farm=farm_id)
farm_instance = Farm.objects.get(farm=farm_filter[0].farm)
update_farm_form = UpdateFarmForm(instance=farm_instance)
assign_sensor_form = AssignmentForm()
if request.method == 'POST' and 'updatefarm' in request.POST:
update_farm_form = UpdateFarmForm(request.POST, instance=farm_instance)
if update_farm_form.is_valid():
update_farm_form.save()
return redirect(farm, farm_id=farm_id)
else:
if request.method == "POST" and 'assignsensor' in request.POST:
assign_sensor_form = AssignmentForm(request.POST)
if assign_sensor_form.is_valid():
assignment = assign_sensor_form.save()
if user.is_staff is True:
assignment.company_id = farm_filter[0].company_id
else:
assignment.company_id = user.profile.company_id
assignment.save()
return redirect(farm, farm_id=farm_id)
else:
assign_sensor_form = AssignmentForm(request.POST)
return render(request, 'users/farm_template.html', {'company_id': company_id, 'farm_filter': farm_filter, 'farm_current': farm_current, 'serial_filter': serial_filter, 'assignment_filter': assignment_filter, 'update_farm_form': update_farm_form, 'assign_sensor_form': assign_sensor_form})
urls.py
from django.conf.urls import url, include
from django.contrib.auth import views as auth_views
from apps.dashboard import views
from apps.dashboard.views import DeleteAssignment, DeleteFarm
urlpatterns = [
url(r'^company/', views.company_view, name='company'),
# url(r'^test/', views.test),
# url(r'^test2/', views.test2, name='test2'),
# url(r'^farms/', views.add_farms),
url(r'^manual-signup/', views.signup_manual),
url(r'^signup/(?P<company_id>.+)', views.signup_company),
url(r'^settings/', views.update_profile),
url(r'^create-company/', views.create_company),
url(r'^create-sensor/', views.create_sensor),
url(r'^assign-sensor/', views.assign_sensor),
url(r'^login/$', auth_views.login, {'template_name': 'login.html'}, name='login'),
url(r'^logout/$', auth_views.logout, {'next_page': '/login'}, name='logout'),
url(r'^$', views.main),
# url(r'^company/(?P<company_id>.+)/farm/(?P<farm_id>.+)', views.farm),
url(r'^farm/(?P<farm_id>.+)', views.farm, name='farm'),
url(r'^unit/(?P<sensor_id>.+)', views.unit),
# url(r'^company/(?P<company_id>.+)', views.company),
url(r'^download/', views.download),
# url(r'^export/xls/$', views.export_users_xls),
url(r'^live/', views.live),
url(r'^data/', views.data),
url(r'^debug/', views.debug),
url(r'^delete-assignment/(?P<pk>\d+)/$', DeleteAssignment.as_view(), name='delete-assignment', ),
url(r'^delete-farm/(?P<pk>\d+)/$', DeleteFarm.as_view(), name='delete-farm', ),
url(r'^', include('django.contrib.auth.urls'))
]
这是在成功提交表单后重定向到自身的视图。这会根据用户提交重新加载 tables,暂时无需处理 js。
return redirect(farm, farm_id=farm_id)
中的 farm_id
是通过 urls.py [=26] 中的相应行从 url 捕获的=]
这就是我想要对删除视图做的全部,而不是成功 url 只是一个视图,一个像我上面那样的带有变量的视图。
是的,你可以用success_url
这样做:
class DeleteAssignment(DeleteView):
. . . . .
. . . . .
. . . . .
def get_success_url(self):
# if you are passing 'pk' from 'urls' to 'DeleteView' for company
# capture that 'pk' as companyid and pass it to 'reverse_lazy()' function
companyid=self.kwargs['pk']
return reverse_lazy('company', kwargs={'pk': companyid})
这应该可以完美运行。
正如 Nickie 在评论中所建议的那样:https://docs.djangoproject.com/en/1.11/ref/class-based-views/mixins-editing/#django.views.generic.edit.DeletionMixin.success_url
用 success_url = "/farm/{farm_id}"
解决了这个问题
我有一个 DeleteView
用于从模型中删除 objects。它是通过 table 中的按钮启动的。它工作正常。
class DeleteAssignment(DeleteView):
model = Assignment
success_url = reverse_lazy('company')
我只想拥有它 return 到它 parent 对成功的看法。我目前将其重定向到 parent 的 parent (company
),因为此视图不需要变量。这很简单,但是 parent 视图需要一个变量 farm_id
来呈现,这是从 url 中捕获的,例如“/farm/18”
url(r'^farm/(?P<farm_id>.+)', views.farm, name='farm'),
我已经用页面上的表单解决了这个问题,方法是让它们使用变量 farm_id
.
farm
return redirect(farm, farm_id=farm_id)
如何使用 success_url
为我的 DeleteView
执行此操作?
尼基的例子:
views.py
@login_required
def farm(request, farm_id=None):
user = request.user
company_id = user.profile.company_id
farm_id = farm_id
farm_filter = Farm.objects.filter(farm=farm_id)
farm_current = farm_filter[0]
# farm_company =
serial_filter = Sensor.objects.filter(assignment__farm__company_id__isnull=True)
assignment_filter = Assignment.objects.filter(farm=farm_id)
farm_instance = Farm.objects.get(farm=farm_filter[0].farm)
update_farm_form = UpdateFarmForm(instance=farm_instance)
assign_sensor_form = AssignmentForm()
if request.method == 'POST' and 'updatefarm' in request.POST:
update_farm_form = UpdateFarmForm(request.POST, instance=farm_instance)
if update_farm_form.is_valid():
update_farm_form.save()
return redirect(farm, farm_id=farm_id)
else:
if request.method == "POST" and 'assignsensor' in request.POST:
assign_sensor_form = AssignmentForm(request.POST)
if assign_sensor_form.is_valid():
assignment = assign_sensor_form.save()
if user.is_staff is True:
assignment.company_id = farm_filter[0].company_id
else:
assignment.company_id = user.profile.company_id
assignment.save()
return redirect(farm, farm_id=farm_id)
else:
assign_sensor_form = AssignmentForm(request.POST)
return render(request, 'users/farm_template.html', {'company_id': company_id, 'farm_filter': farm_filter, 'farm_current': farm_current, 'serial_filter': serial_filter, 'assignment_filter': assignment_filter, 'update_farm_form': update_farm_form, 'assign_sensor_form': assign_sensor_form})
urls.py
from django.conf.urls import url, include
from django.contrib.auth import views as auth_views
from apps.dashboard import views
from apps.dashboard.views import DeleteAssignment, DeleteFarm
urlpatterns = [
url(r'^company/', views.company_view, name='company'),
# url(r'^test/', views.test),
# url(r'^test2/', views.test2, name='test2'),
# url(r'^farms/', views.add_farms),
url(r'^manual-signup/', views.signup_manual),
url(r'^signup/(?P<company_id>.+)', views.signup_company),
url(r'^settings/', views.update_profile),
url(r'^create-company/', views.create_company),
url(r'^create-sensor/', views.create_sensor),
url(r'^assign-sensor/', views.assign_sensor),
url(r'^login/$', auth_views.login, {'template_name': 'login.html'}, name='login'),
url(r'^logout/$', auth_views.logout, {'next_page': '/login'}, name='logout'),
url(r'^$', views.main),
# url(r'^company/(?P<company_id>.+)/farm/(?P<farm_id>.+)', views.farm),
url(r'^farm/(?P<farm_id>.+)', views.farm, name='farm'),
url(r'^unit/(?P<sensor_id>.+)', views.unit),
# url(r'^company/(?P<company_id>.+)', views.company),
url(r'^download/', views.download),
# url(r'^export/xls/$', views.export_users_xls),
url(r'^live/', views.live),
url(r'^data/', views.data),
url(r'^debug/', views.debug),
url(r'^delete-assignment/(?P<pk>\d+)/$', DeleteAssignment.as_view(), name='delete-assignment', ),
url(r'^delete-farm/(?P<pk>\d+)/$', DeleteFarm.as_view(), name='delete-farm', ),
url(r'^', include('django.contrib.auth.urls'))
]
这是在成功提交表单后重定向到自身的视图。这会根据用户提交重新加载 tables,暂时无需处理 js。
return redirect(farm, farm_id=farm_id)
中的 farm_id
是通过 urls.py [=26] 中的相应行从 url 捕获的=]
这就是我想要对删除视图做的全部,而不是成功 url 只是一个视图,一个像我上面那样的带有变量的视图。
是的,你可以用success_url
这样做:
class DeleteAssignment(DeleteView):
. . . . .
. . . . .
. . . . .
def get_success_url(self):
# if you are passing 'pk' from 'urls' to 'DeleteView' for company
# capture that 'pk' as companyid and pass it to 'reverse_lazy()' function
companyid=self.kwargs['pk']
return reverse_lazy('company', kwargs={'pk': companyid})
这应该可以完美运行。
正如 Nickie 在评论中所建议的那样:https://docs.djangoproject.com/en/1.11/ref/class-based-views/mixins-editing/#django.views.generic.edit.DeletionMixin.success_url
用 success_url = "/farm/{farm_id}"