避免在Django用户编辑表单中使用用户pk

时间:2017-11-08 19:37:14

标签: python django

我想创建一个Django表单来编辑用户信息。我有:

urls.py

url(r'^settings/(?P<pk>[0-9]+)/', views.edit_profile, name='edit'),

views.py

@login_required
def edit_profile(request, pk):
    user = get_object_or_404(User, pk=pk)
    if request.method == 'POST':
        form = UserForm(request.POST, instance=user)

        if form.is_valid():
            form.save()
    else:
        form = UserForm(instance=user)
    return render(request, 'edit_user.html', {'form': form})

像这样,当用户编辑其信息时,可以从url更改pk并查看其他用户信息。如何在网址中隐藏此pk?

感谢。

3 个答案:

答案 0 :(得分:3)

There's no need to accept the pk in the URL at all. The logged in user is always available as request.user, so you can pass this directly as the instance argument to the form.

if request.method == 'POST':
    form = UserForm(request.POST, instance=request.user)

    if form.is_valid():
        form.save()
else:
    form = UserForm(instance=request.user)
return render(request, 'edit_user.html', {'form': form})

答案 1 :(得分:0)

更新您的网址

url(r&#39; ^ settings /&#39;,views.edit_profile,name =&#39; edit&#39;)

尝试向网址发送POST请求,没有人看到您发送到服务器的内容。

答案 2 :(得分:-2)

您可以创建自定义模板过滤器,以检查用户是否正在编辑自己的个人资料。

创建自定义标记:

首先发送名为pk的上下文,其等于配置文件pk然后..

在app目录中创建一个名为templatetags的目录,并在其中添加一个名为__init__.py - 两个得分的python文件 - 现在创建另一个名为{{1}的文件输入以下内容:

profile_extras.py

现在在编辑个人资料模板中添加此

from django.template.loader_tags import register
@register.filter(name="ownPro")
def ownPro(user, id):
    if Profile.objects.get(id=id).user == user:
        return True
    else:
        return False
  

不要忘记重启服务器