扩展Django用户模型

3

我正在尝试为我的Django应用程序创建注册表单。为此,我已扩展了用户模型。这是我的Forms.py文件:

from contact.models import register
from django import forms
from django.contrib import auth
class registerForm(forms.ModelForm):

    class Meta:
    model=register
        fields = ('latitude', 'longitude', 'status')
    class Meta:
        model = auth.models.User # this gives me the User fields
        fields = ('username', 'first_name', 'last_name', 'email')

这是我的model.py文件

from django.db import models
from django.contrib.auth.models import User
STATUS_CHOICES = (
('Online', 'Online.'),
('Busy', 'Busy.'),
('AppearOffline', 'AppearOffline.'),)
 class register(models.Model): 

    user = models.ForeignKey('auth.User', unique = True) 
    latitude = models.DecimalField(max_digits=8, decimal_places=6)
    longitude = models.DecimalField(max_digits=8, decimal_places=6)
status = models.CharField(max_length=8,choices=STATUS_CHOICES, blank= True, null=True)

我不知道在哪里出了错。用户的密码无法在登录时被接受,而纬度和经度也未被保存到创建的用户中。我对Django相当新手,不知道该怎么办。有人有解决方案吗?

2个回答

2
要继承Django的用户模型,您需要像这样做:

要从django的用户模型继承,您必须像这样做:

from django.contrib.auth.models import User
class MyUserClass(User):
    #your fields go here

但如果您只想存储纬度/经度,则另一种扩展用户模型的方法适合您,即创建与用户模型相关的用户配置文件。请参见此处:http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/。然后,您可以找到一个解决方案,在UserAdmin子类中通过InlineAdmin管理相关配置文件!
请参考以下内容以扩展管理员:http://pyxx.org/2008/08/18/how-to-extend-user-model-in-django-and-enable-new-fields-in-newforms-admin/
并参考以下内容以在创建新用户时自动创建用户配置文件:Django: UserProfile with Unique Foreign Key in Django Admin

为什么使用UserProfile方式是最好的?这是我目前的做法,但我一直告诉自己,如果我通过继承来实现它会更好。James Bennett在扩展用户模型方面撰写的博客已经过时了。而且Django自那以后发生了很大变化。所以我的问题是:通过继承来实现有什么问题吗?是否存在任何问题?(Django 1.2+) - rdegges
我并不认为通过继承来实现是错误的!这取决于你想要达到什么效果,而且添加用户配置文件是官方推荐的方法,如果只是添加两个字段,那这完全没有问题! - Bernhard Vallant
谢谢帮助...我用这种方式做了,但是遇到了另一个问题,表单上只显示了一个密码字段。还有一个链接说“更改密码表单”,但是我甚至无法访问该链接,它给了我一个页面未找到的错误。当我从Django管理界面检查时,密码没有保存在数据库中。任何帮助都感谢。 - MajorGeek
你是否注销了原始的UserAdmin并注册了继承自原始UserAdmin的MyUserAdmin?(admin.site.unregister(User); admin.site.register(User, MyUserAdmin)) - Bernhard Vallant

1

当您需要自定义方法来操作用户对象时,“User”模型的继承是一个不错的选择。要存储其他信息,最好的方法是使用单独的模型类。 如果您想在管理面板中内联显示新字段,则需要像这样重新注册用户模型:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from MyApp.models import MyUserProfile

class MyUserProfileInline(admin.TabularInline):
    model = MyUserProfile
    fk_name = 'user'
    max_num = 1

class NewUserAdmin(UserAdmin):
    inlines = [MyUserProfileInline, ]

# Then reregister
admin.site.unregister(User)
admin.site.register(User, NewUserAdmin)

请参考相关问题:https://dev59.com/_XVD5IYBdhLWcg3wO5AD - viam0Zah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接