在Django中为用户添加自定义字段

xxslljrj  于 2022-12-30  发布在  Go
关注(0)|答案(5)|浏览(213)

我正在使用Django提供的create_user()函数来创建我的用户。我想存储关于用户的附加信息。我尝试按照
http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
但我无法让它为我工作。有没有一个循序渐进的指南,我可以遵循,让它的工作?
此外,一旦我添加了这些自定义字段,我显然需要添加/编辑/删除其中的数据。我似乎找不到任何关于如何做到这一点的说明。

gk7wooem

gk7wooem1#

推荐的方法是创建一个新模型,并为它提供一个内置User模型的OneToOneField(),如下所示:

class Student(models.Model):
    user = models.OneToOneField(User)
    college = models.CharField(max_length=30)
    major = models.CharField(max_length=30)

等等。
然后,您可以按如下方式访问字段:

user = User.objects.get(username='jsmith')
college = user.student.college
unhi4e5o

unhi4e5o2#

我知道已经太晚了,Django从那时起已经改变了很多,但是对于求知者来说,
根据Django文档,如果你对用户模型很满意,并且只想添加一些额外的字段,请执行以下操作:
1-您的models.py应该如下所示:

from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
    mobile = models.CharField(max_length=16)
    # if your additional field is a required field, just add it, don't forget to add 'email' field too.
    # REQUIRED_FIELDS = ['mobile', 'email']

2-将其添加到setting.py

AUTH_USER_MODEL = 'myapp.CustomUser'

搞定!
现在您可以运行python manage.py syncdb

laximzn5

laximzn53#

我不知道一步一步来(尽管我相信一个坚实的谷歌会产生一些东西),但这里有一个快速的尝试。
1)创建一个UserProfile模型来保存额外的信息,并将其放入您的models.py中。

class UserProfile(models.Model):
    #required by the auth model
    user = models.ForeignKey(User, unique=True)
    middle_name = models.CharField(max_length=30, null=True, blank=True)

2)通过添加以下行(使用适当的名称),告诉settings.py有关新类的信息:

AUTH_PROFILE_MODULE = "myapp.UserProfile"

3)添加一个信号监听器,在添加新用户时创建一个空白的UserProfile记录。您可以找到一个很棒的代码片段,其中包含here的说明。
4)在处理新用户记录时,您也可以填充UserProfile记录,下面是我如何执行插入操作(注意get_profile):

if (form.is_valid()):
    cd = form.cleaned_data
    user = User.objects.create_user(cd["UserName"], cd["Email"], cd["Password"])
    user.first_name = cd["FirstName"]
    user.last_name = cd["LastName"]
    user.save()
    #Save userinfo record
    uinfo = user.get_profile()
    uinfo.middle_name = cd["MiddleName"]
    uinfo.save()

这就是它的全部。这并不全面,但应该为你指明正确的方向。

**更新:**请注意,AUTH_PROFILE_MODULE自v1.5起已弃用:https://docs.djangoproject.com/en/stable/releases/1.5/#auth-profile-module

zpgglvta

zpgglvta4#

我几乎在2023年到达。此刻的Django在4.1.4上...
如果你想扩展用户模型而不替换它,按照django文档你可以:
1.如果您的更改纯粹是行为性的,并且不需要更改数据,请基于用户模型创建代理模型。
1.在新模型中使用OneToOneField。这样,您可以向现有用户模型添加更多字段:

from django.contrib.auth.models import User

class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    department = models.CharField(max_length=100)

这样,您就可以从用户模型中查询新字段:

>>> u = User.objects.get(username='fsmith')
>>> freds_department = u.employee.department

如果你想调整管理员配置文件中的用户数据,你可以这样编辑你的admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User

from my_user_profile_app.models import Employee

# Define an inline admin descriptor for Employee model
# which acts a bit like a singleton
class EmployeeInline(admin.StackedInline):
    model = Employee
    can_delete = False
    verbose_name_plural = 'employee'

# Define a new User admin
class UserAdmin(BaseUserAdmin):
    inlines = (EmployeeInline,)

# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
fiei3ece

fiei3ece5#

它只是另一个模型,你操纵它的方式和操纵你遇到的其他模型的方式完全一样。

相关问题