Django 使用基于类的视图编辑用户配置文件

Posted

技术标签:

【中文标题】Django 使用基于类的视图编辑用户配置文件【英文标题】:Django edit user profile with Class Based Views 【发布时间】:2021-05-03 02:43:10 【问题描述】:

我正在尝试在 Django 3.1 中开发个人资料编辑页面。我对此很陌生,所以如果有些东西很时髦,那就这么说吧。我从Django edit user profile复制了一些内容

Views.py

from myapp.forms import UserForm, UserProfileInfoForm
from django.views.generic import (View, TemplateView, UpdateView)
from myapp.models import UserProfileInfo

class UpdateProfile(UpdateView):
    model = UserProfileInfoForm
    fields = ['first_name', 'last_name', 'email', 'phone', 'title', 'password']
    template_name = 'profile.html'
    slug_field = 'username'
    slug_url_kwarg = 'slug'

models.py

class UserProfileInfo(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone = PhoneField(blank=True, help_text='Contact phone number')
    title = models.CharField(max_length=255)
    system_no = models.CharField(max_length=9)

    def __str__(self):
       return self.user.username

forms.py

#...
from myapp.models import UserProfileInfo

class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())

    class Meta():
        model = User
        fields = ('username', 'email', 'password', 'first_name', 'last_name')

class UserProfileInfoForm(forms.ModelForm):
    class Meta():
        model = UserProfileInfo
        fields = ('phone', 'title', 'system_no')

myapp/urls.py

from django.urls import path
from . import views

app_name = 'myapp'

urlpatterns = [
    path('', views.index,name='index'),
    path('about/',views.AboutView.as_view(),name='about'),
    path('register/', views.register,name='register'),
    path('profile/', views.UpdateProfile.as_view(), name='profile'),
]

我有一个仅在登录后显示的链接: base.html(仅限href)

<a class="nav-link active" href="% url 'myapp:profile' %">Profile</a>

你能告诉我要解决什么问题吗?单击上面的链接后,我在浏览器中收到一条错误消息

/profile/ 处的属性错误

类型对象“UserProfileInfoForm”没有属性“_default_manager”

【问题讨论】:

【参考方案1】:

到目前为止,你做得很好。注意这些:

1.如果您使用基于UpdateView 类的视图,model 字段必须是模型的名称而不是表单。(UserProfileInfo)

2.如果您使用基于类的视图,最好在类中有一个成功的 url,以便在成功尝试后重定向

3.如果您使用的是UpdateView,则无需在forms.py 中为该模型提供表格。您所需要的只是模板更新视图中的一个表单标签,它将为您处理并自动保存更改。

    如果你想使用表单(如果你想在类不自动执行的情况下保存某事),最好使用FormView,记住这里你必须自己保存表单 链接到FormView

如果您想长期使用 django,我强烈建议您查看此链接并开始阅读文档https://docs.djangoproject.com/en/3.1/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView

【讨论】:

忘记了,你的错误原因是类中的模型必须是模式而不是表单,所以改变它就可以了,如果你使用 UpdateView,你的表单在这里毫无用处跨度>

以上是关于Django 使用基于类的视图编辑用户配置文件的主要内容,如果未能解决你的问题,请参考以下文章

基于 Django 类的视图 - 具有两个模型表单的 UpdateView - 一个提交

在基于 django rest 类的视图中允许不同类型的用户使用不同的视图

如何在 Django 中使用基于类的视图将用户重定向到登录页面? [复制]

基于 Django 类的视图中的身份验证用户

使用基于类的 UpdateView 在 Django 中更新用户模型

Django 在基于类的视图中处理多个表单