【问题标题】:Django edit auth user profileDjango编辑身份验证用户配置文件
【发布时间】:2018-02-20 15:11:26
【问题描述】:

我是 Django 的新手,正在 Django 1.11 中编写应用程序。

我想创建一个Profile update 页面。

我创建了一个应用程序accounts 来管理所有与个人资料相关的活动并创建了一个类

from django.contrib.auth.models import User

# Create your views here.
from django.views.generic import TemplateView, UpdateView


class ProfileView(TemplateView):
    template_name = 'accounts/profile.html'


class ChangePasswordView(TemplateView):
    template_name = 'accounts/change_password.html'


class UpdateProfile(UpdateView):
    model = User
    fields = ['first_name', 'last_name']

    template_name = 'accounts/update.html'

myapp/accounts/urls.py

from django.conf.urls import url

from . import views

app_name = 'accounts'
urlpatterns = [
    url(r'^$', views.ProfileView.as_view(), name='profile'),
    url(r'^profile/', views.ProfileView.as_view(), name='profile'),
    url(r'^change_password/', views.ChangePasswordView.as_view(), name='change_password'),
    url(r'^update/', views.UpdateProfile.as_view(), name='update'),
    url(r'^setting/', views.SettingView.as_view(), name='setting')
]

当我访问127.0.0.1:8000/accounts/update时,它给出了

AttributeError at /accounts/update/

Generic detail view UpdateProfile must be called with either an object pk or a slug.

因为,我希望登录用户编辑他/她的个人资料信息。我不想在网址中传递pk

如何在 Django 1.11 中创建个人资料更新页面?

【问题讨论】:

    标签: python django django-views django-authentication


    【解决方案1】:
    class UpdateProfile(UpdateView):
        model = User
        fields = ['first_name', 'last_name']
    
        template_name = 'accounts/update.html'
    
        def get_object(self):
            return self.request.user
    

    正如错误告诉您的那样,如果您不精确处理对象,则必须返回 pk 或 slug。因此,通过覆盖 get_object 方法,您可以告诉 django 您要更新哪个对象。

    如果你喜欢用另一种方式来做,你可以在 url 中发送对象的 pk 或 slug :

    url(r'^update/(?P<pk>\d+)', views.UpdateProfile.as_view(), name='update')
    

    这里默认的get_object 方法会捕获args 中的pk 并找到您要更新的用户。

    请注意,第一种方法仅在用户想要更新他的个人资料并通过身份验证 (self.request.user) 时才有效(如我所写),而第二种方法允许您真正更新您想要的任何用户,只要您拥有该用户的 pk(accounts/update/1,将使用 pk=1 更新用户等...)。

    一些文档here,get_object() 部分

    返回视图正在显示的对象。 默认情况下,这需要 self.querysetpkslug 参数 在 URLconf 中,但子类可以覆盖它以返回任何对象。

    【讨论】:

    • 我得到了这个工作。但是如何根据数据是否更新来重定向用户。我可以看到,数据正在更新并要求重定向 URL。
    • 什么意思?您想在更新后(或者如果我理解的话)将用户重定向到哪里?如果内容很长,请考虑提出另一个问题,因为这是您问题的一个答案
    猜你喜欢
    • 1970-01-01
    • 2019-12-22
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2014-04-29
    • 1970-01-01
    相关资源
    最近更新 更多