【问题标题】:extending django usermodel扩展 django 用户模型
【发布时间】:2011-02-28 06:10:24
【问题描述】:

我正在尝试为我的 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 的新手,不知道该怎么做 任何机构都有任何解决方案。?

【问题讨论】:

    标签: django model django-users


    【解决方案1】:

    要从 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+)
    • 我不认为通过继承来做是错的!这取决于您想要实现的目标,添加用户配置文件是官方推荐的方式,我猜如果只是添加两个字段,那完全没问题!
    • 感谢您的帮助...我这样做了,但遇到了另一个问题,即表单上只显示了一个密码字段。和一个链接说“更改密码表格”,但甚至无法访问该链接它给了我一个找不到页面的错误。当我从 django 管理员那里检查密码时,密码没有保存在数据库中,谢谢
    • 您是否取消注册了原始 UserAdmin 并注册了继承自原始 UserAdmin 的用户管理员? (admin.site.unregister(User); admin.site.register(User, MyUserAdmin)
    【解决方案2】:

    Inheritance of "User" model good 当您需要自定义方法来操作用户对象时。要存储其他信息,best way is to use separate model class for this。 如果你想在管理面板中内联你的新字段,你需要像这样重新注册用户模型:

    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)
    

    【讨论】:

    猜你喜欢
    • 2016-10-12
    • 2013-12-06
    • 2018-01-21
    • 2018-04-24
    • 2017-03-02
    • 2018-01-22
    • 1970-01-01
    相关资源
    最近更新 更多