Fra*_*coA 8 django django-forms django-admin django-authentication django-syncdb
我正在尝试使用AbstractUser向Django的标准用户模型添加字段.这是我的代码:
class GUser(AbstractUser):
uuid = UUIDField(auto=True)
Run Code Online (Sandbox Code Playgroud)
这是成功的,因为从壳我可以说,
>>> a = GUser.objects.all()
>>> a
[<GUser: User1>]
>>> a[0].uuid
UUID('7d1f0b7b52144a2ea20db81ce74741e3')
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是从/ admin注册一个新用户.当我创建一个新用户时,我收到一个数据库错误:
no such table: auth_user
Run Code Online (Sandbox Code Playgroud)
在我了解它之前,这是我的forms.py:
class GUserChangeForm(UserChangeForm):
class Meta:
model = get_user_model()
class GUserCreationForm(UserCreationForm):
class Meta:
model = get_user_model()
def clean_username(self):
username = self.cleaned_data["username"]
try:
get_user_model().objects.get(username=username)
except get_user_model().DoesNotExist:
return username
raise forms.ValidationError(self.error_messages['duplicate'])
Run Code Online (Sandbox Code Playgroud)
而我的admin.py:
class GUserAdmin(UserAdmin):
form = GUserChangeForm
add_form = GUserCreationForm
fieldsets = (
(None, {'fields': [('username', 'password')]}),
('Personal info', {'fields': ('is_active','is_staff','is_superuser','groups', 'user_permissions')}),
('Important dates', {'fields': ('last_login', 'date_joined')}),
#('Universal ID', {'fields': ('uuid')})
)
admin.site.register(GUser,GUserAdmin)
Run Code Online (Sandbox Code Playgroud)
我读到,当其他人发生这种情况时,他们实现了自己的表单(就像我一样)来覆盖clean_username(self):
但是,当我尝试从管理员添加用户时,我不认为这会被调用.即使我注册了我的GUserAdmin,也会调用auth.forms.py文件.
此外,当我删除我的数据库(sqlite3)然后调用python manage.py syncdb时,我发现实际上没有创建auth_user表.
是的,我在settings.py中包含了AUTH_USER_MODEL.
任何帮助将不胜感激.
我看过:http: //psocdddang
除了大量的SO帖子,但它们似乎没有解决我遇到的问题.
因此,删除了我为此所做的所有工作,并继续使用标准用户,以便我能够取得进展。然后有一天,我又回去研究它,并设法在一小时内让它工作起来。我将发布代码以供参考,但我无法真正指出是什么造成了差异。我确实知道创造形式和东西并不是必需的。
模型.py
class PropaUser(AbstractUser):
uuid = UUIDField(auto=True)
Run Code Online (Sandbox Code Playgroud)
管理员.py
from django.contrib import admin
from login.models import PropaUser
admin.site.register(PropaUser)
Run Code Online (Sandbox Code Playgroud)
设置.py
AUTH_USER_MODEL = "login.PropaUser"
Run Code Online (Sandbox Code Playgroud)
其他模型.py
class Word(models.Model):
user = models.ManyToManyField(settings.AUTH_USER_MODEL)
deck = models.ManyToManyField(Deck)
word = models.CharField(max_length=100)
def __unicode__(self): # Python 3: def __str__(self):
return self.word
Run Code Online (Sandbox Code Playgroud)
这就是有效的方法。我不知道之前是什么导致了所有问题,因为我想我在发布这个问题之前尝试过这种方法。这可能不是一个令人满意的答案,但这是有效的。早些时候,我也对简单地向现有用户添加一个字段需要做什么感到困惑。就是这个。
| 归档时间: |
|
| 查看次数: |
6355 次 |
| 最近记录: |