python - django allauth 适配器注册:禁止保存()以防止由于未保存的相关对象“用户”而导致数据丢失
问题描述
我正在使用 Django 和 Allauth。我需要用户能够使用附加字段进行注册,所以我创建了一个自定义用户调用配置文件、一个自定义 SignupForm 和一个适配器,但是当我提交时我收到错误“ save() disabled to prevent data loss due to unsaved related对象'用户' ”。
自定义表格
class CustomSignupForm(SignupForm):
first_name = forms.CharField(
max_length=200,
label='Nome*',
widget=forms.TextInput(attrs={'placeholder': 'Il tuo nome'}),
required=True
)
last_name = forms.CharField(
max_length=200,
label='Cognome*',
widget=forms.TextInput(attrs={'placeholder': 'Il tuo cognome'}),
required=True
)
etc...
def signup(self, request, user):
user.email = self.cleaned_data['email']
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.address = self.cleaned_data['address']
user.cap = self.cleaned_data['cap']
user.city = self.cleaned_data['city']
user.province = self.cleaned_data['province']
user.state = self.cleaned_data['state']
user.pi = self.cleaned_data['pi']
user.cf = self.cleaned_data['cf']
user.save()
适配器
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.address = data.get('address')
user.cap = data['cap']
user.city = data['city']
user.province = data['province']
user.state = data['state']
user.pi = data['pi']
user.cf = data['cf']
if 'password1' in data:
user.set_password(data['password1'])
else:
user.set_unusable_password()
self.populate_username(request, user)
if commit:
user.save()
return user
自定义用户模型(配置文件)
class Profile(AbstractUser):
artist_name = models.CharField(max_length=200, blank=True, null=True)
address = models.CharField(max_length=200, null=True)
cap = models.PositiveIntegerField(null=True)
city = models.CharField(max_length=200, null=True)
province = models.CharField(max_length=200, null=True)
state = models.CharField(max_length=200, null=True)
pi = models.CharField(max_length=200, blank=True, null=True)
cf = models.CharField(max_length=200, blank=True, null=True)
bio = models.TextField(blank=True, null=True)
image = models.ImageField(blank=True, null=True)
instagram_url = models.URLField(blank=True, null=True)
facebook_url = models.URLField(blank=True, null=True)
twitter_url = models.URLField(blank=True, null=True)
soundcloud_url = models.URLField(blank=True, null=True)
credits = models.PositiveIntegerField(default=2)
def __str__(self):
return self.email
设置.py
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
ACCOUNT_AUTHENTICATION_METHOD = 'email'
AUTH_USER_MODEL = 'profiles.Profile'
ACCOUNT_ADAPTER = 'main.adapter.AccountAdapter'
ACCOUNT_FORMS = {
'signup': 'main.forms.CustomSignupForm',
}
我的代码有什么问题?
解决方案
尝试save
在您的表单类上添加一个方法:
class CustomSignupForm(SignupForm):
# ...
def save(self, user):
user.save()
推荐阅读
- javascript - Javascript - 如何向本地 json 文件发出获取请求?
- docker - node-exporter 应该从主机还是容器运行?
- c++ - 如何使用原子指针执行双缓冲?
- rest - Keycloak PUT REST 415
- merge - 读取和合并计算机集群上的大表
- angular - 从 JQuery-UI 回调到 Angular 6
- laravel - 在 Laravel 中搜索
- unit-testing - 带有任何参数的 Mockito when() 无法按预期工作
- javascript - 由于切换功能,div 被隐藏
- grails - 在 Grails 的 json 视图中访问控制器参数