我正在使用内置的django管理站点作为应用程序的管理站点,这意味着POST
请求的构建与其等效的管理站点相同,并发送到相同的url
。因此,就像应用程序管理站点只是该管理站点的包装。
我的问题是,我不知道如何重定向回到最初发布的url
。当前,它重定向到“更改用户”管理员页面。我希望它重定向回页面。
这是我的change-password-template.html
:
<div>
<form action="{% url 'admin:auth_user_password_change' user.pk %}" method="post" id="change-password-form">
{% csrf_token %}
# ... here goes the password fields
<input type="submit" value="Change password">
</div>
<input type="hidden" name="next" value="{% url 'change_password' id=user.pk%}"> # my attempt at trying to redirect back to the original webpage
</div>
</form>
</div>
因此,它确实正确地发布到admin/auth/user/{{user.pk}}/password/
,但不是将 back 重定向到该页面,而是重定向到:admin/auth/user/{{user.pk}}/change/
。我该怎么做呢?
答案 0 :(得分:1)
您将需要在用户管理员中覆盖user_change_password
方法,因为重定向是在此进行的:
# contrib.auth.admin.py
def user_change_password(self, request, id, form_url=''):
...
if request.method == 'POST':
form = self.change_password_form(user, request.POST)
if form.is_valid():
...
return HttpResponseRedirect(
reverse(
'%s:%s_%s_change' % (
self.admin_site.name,
user._meta.app_label,
user._meta.model_name,
),
args=(user.pk,),
)
)
由于此ModelAdmin
已在auth
应用程序中注册,您将需要取消注册,添加自己的自定义UserAdmin
。 django docs中有关于如何执行此操作的明确说明。完成此操作后,只需覆盖上面的方法并编辑重定向即可。
但是,这将比其应付出的努力多得多,而且更重要的是,这也是一个讨厌的黑客。这不是管理界面的用途。 (它还会产生意想不到的副作用,当您实际使用管理应用程序时,它现在将重定向到您现在告诉它的任何位置-这将是非常不寻常的行为。)
如果您想添加一个端点,用户可以在该端点上更改密码,这并不难事,这是这种情况下的最佳解决方案。
from django.contrib.auth.models import User
from django.http import HttpResponseRedirect
from django.urls import reverse
def change_password(request, user_id):
new_password = request.POST["password"]
user = User.objects.get(id=user_id)
user.set_password(new_password)
user.save()
return HttpResponseRedirect(reverse('your_url_here))
您需要添加一些其他检查(例如,确保用户具有适当的权限,确保请求为POST等)。
Django实际上具有执行此操作的内置视图,您可以将其子类化以进行自定义。
# views.py
from django.contrib.auth.views import PasswordChangeView
class MyPasswordChangeView(PasswordChangeView):
success_url = reverse("url_to_redirect_to")
# urls.py
urlpatters = [
path('change_password', MyPasswordChangeViews.as_view())
]
您可以详细了解这些内置视图here。