如何让 django-all auth 将数据传递给自定义用户模型?
How to get django-all auth to pass data to custom user model?
我正在使用 django-allauth 进行身份验证在 Django 中创建一个站点。
我在 accounts.models 中创建了自定义用户 class 以添加自定义字段 FavouriteTeam。
我遇到的问题是表单呈现良好并为 fav_team 提交表单数据很好(在 Chrome 开发工具中检查过)但是 fav_team 条目没有被存储到 user.FavouriteTeam 我不知道为什么。
我可以进入 Django shell,从 accounts.models 导入我的用户 class,查询用户,添加 .FavouriteTeam,然后保存就好了。只是出于某种原因,表单似乎没有将数据保存到新的 User 实例中。
我猜这是由于 django-allauth 与自定义用户模型交互的方式所致,但我终究无法弄明白。我看过一些类似的帖子,但 none 遇到过这样的情况,或者有一个似乎对我有用的解决方案。
有什么想法吗?
accounts.models: -
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
FavouriteTeam = models.ForeignKey('predictor.Team', on_delete=models.CASCADE, blank=True, null=True)
def __str__(self):
return self.email
accounts.forms: -
from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import User
from allauth.account.forms import SignupForm
from predictor.models import Team
from django.contrib.auth import get_user_model
class CustomSignupForm(SignupForm):
first_name = forms.CharField(max_length=30, label='First Name')
last_name = forms.CharField(max_length=30, label='Last Name')
fav_team = forms.ModelChoiceField(queryset=Team.objects.all(), empty_label=None, label='Favourite Team')
class Meta:
model = get_user_model()
def signup(self, request, user):
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.FavouriteTeam = self.cleaned_data['fav_team']
user.save()
return user
predictor.models: -
class Team(models.Model):
ShortName = models.CharField(max_length=4, primary_key=True)
Town = models.CharField(max_length=20)
Nickname = models.CharField(max_length=20)
Conference = models.CharField(max_length=3, null=True, blank=True)
Division = models.CharField(max_length=5, null=True, blank=True)
ConfDiv = models.CharField(max_length=9, null=True, blank=True)
Logo = models.ImageField(default='football.png', upload_to='logos')
def __str__(self):
return('{} {}'.format(self.Town, self.Nickname))
def save(self, *args, **kwargs):
self.ConfDiv = str(self.Conference)+" "+str(self.Division)
super(Team, self).save(*args, **kwargs)
对于看到这个问题并遇到同样问题的人,我最终找到了如下解决方案。
首先,我必须在我的帐户应用程序中创建 adpaters.py 并填写以下内容:-
from allauth.account.adapter import DefaultAccountAdapter
class AccountAdapter(DefaultAccountAdapter):
def save_user(self, request, user, form, commit=False):
data = form.cleaned_data
user.email = data['email']
user.first_name = data['first_name']
user.last_name = data['last_name']
user.FavouriteTeam = data['fav_team']
if 'password1' in data:
user.set_password(data['password1'])
else:
user.set_unusable_password()
self.populate_username(request, user)
user.save()
return user
然后我必须在项目的 settings.py 文件中引用新的帐户适配器,如下所示:-
ACCOUNT_ADAPTER = "accounts.adapters.AccountAdapter"
希望对以后的人有所帮助。
我正在使用 django-allauth 进行身份验证在 Django 中创建一个站点。
我在 accounts.models 中创建了自定义用户 class 以添加自定义字段 FavouriteTeam。
我遇到的问题是表单呈现良好并为 fav_team 提交表单数据很好(在 Chrome 开发工具中检查过)但是 fav_team 条目没有被存储到 user.FavouriteTeam 我不知道为什么。
我可以进入 Django shell,从 accounts.models 导入我的用户 class,查询用户,添加 .FavouriteTeam,然后保存就好了。只是出于某种原因,表单似乎没有将数据保存到新的 User 实例中。
我猜这是由于 django-allauth 与自定义用户模型交互的方式所致,但我终究无法弄明白。我看过一些类似的帖子,但 none 遇到过这样的情况,或者有一个似乎对我有用的解决方案。
有什么想法吗?
accounts.models: -
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
FavouriteTeam = models.ForeignKey('predictor.Team', on_delete=models.CASCADE, blank=True, null=True)
def __str__(self):
return self.email
accounts.forms: -
from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import User
from allauth.account.forms import SignupForm
from predictor.models import Team
from django.contrib.auth import get_user_model
class CustomSignupForm(SignupForm):
first_name = forms.CharField(max_length=30, label='First Name')
last_name = forms.CharField(max_length=30, label='Last Name')
fav_team = forms.ModelChoiceField(queryset=Team.objects.all(), empty_label=None, label='Favourite Team')
class Meta:
model = get_user_model()
def signup(self, request, user):
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.FavouriteTeam = self.cleaned_data['fav_team']
user.save()
return user
predictor.models: -
class Team(models.Model):
ShortName = models.CharField(max_length=4, primary_key=True)
Town = models.CharField(max_length=20)
Nickname = models.CharField(max_length=20)
Conference = models.CharField(max_length=3, null=True, blank=True)
Division = models.CharField(max_length=5, null=True, blank=True)
ConfDiv = models.CharField(max_length=9, null=True, blank=True)
Logo = models.ImageField(default='football.png', upload_to='logos')
def __str__(self):
return('{} {}'.format(self.Town, self.Nickname))
def save(self, *args, **kwargs):
self.ConfDiv = str(self.Conference)+" "+str(self.Division)
super(Team, self).save(*args, **kwargs)
对于看到这个问题并遇到同样问题的人,我最终找到了如下解决方案。
首先,我必须在我的帐户应用程序中创建 adpaters.py 并填写以下内容:-
from allauth.account.adapter import DefaultAccountAdapter
class AccountAdapter(DefaultAccountAdapter):
def save_user(self, request, user, form, commit=False):
data = form.cleaned_data
user.email = data['email']
user.first_name = data['first_name']
user.last_name = data['last_name']
user.FavouriteTeam = data['fav_team']
if 'password1' in data:
user.set_password(data['password1'])
else:
user.set_unusable_password()
self.populate_username(request, user)
user.save()
return user
然后我必须在项目的 settings.py 文件中引用新的帐户适配器,如下所示:-
ACCOUNT_ADAPTER = "accounts.adapters.AccountAdapter"
希望对以后的人有所帮助。