无法将自定义字段保存到django-allauth - 之前的帖子没有帮助

0 投票
1 回答
868 浏览
提问于 2025-04-18 18:31

我正在尝试为用户在注册时创建自定义字段,使用的是django-allauth。我参考了很多相关的帖子,但我无法让我的自定义表单保存到数据库里。在我的signup.html页面上,我确实看到了一个合并的表单,里面有用户名、密码1和2、电子邮件以及我额外添加的城市和学校字段,但我无法将这些额外字段保存到数据库中。我已经运行了syncdb,并且在管理区域看到了我的用户资料表。

这条建议是我离答案最近的,但我不太明白怎么实现:“你不能把UserProfileForm用作allauth.SIGNUP_FORM_CLASS。你需要从SignUpForm扩展它,并编写一个保存方法,这个方法只接受新创建的用户作为参数。”这段话来自这个帖子: 使用django-allauth的自定义注册表单

我还尝试过整合这些帖子中的建议: Django Allauth没有保存自定义表单 如何在使用django-allauth时自定义用户资料

这是我的代码: Models.py

from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
# A required line - links a UserProfile to User.
user = models.OneToOneField(User)

# The additional attributes we wish to include.
school = models.CharField(max_length=128)
city = models.CharField(max_length=128)

def __unicode__(self):
    return self.user.username

Forms.py

 from django import forms
 from django.contrib.auth.models import User
 from myapp.models import UserProfile
 from django.forms.widgets import HiddenInput
class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('city', 'school')

def signup(self, request, user):
 user=User.objects.get(email=request.email)
 city=request.POST.get('city','')
 school=request.POST.get('school','')
 userprofile_obj = UserProfile(user=user,city=city,school=school)
 userprofile_obj.save()

Settings.py

 ACCOUNT_SIGNUP_FORM_CLASS = 'myapp.forms.UserProfileForm'

我的模板是django-allauth模板中的基本Signup.html,我没有为此创建视图,虽然我尝试过从tangowithdjango的用户认证部分的注册视图中创建一个,但结果表现类似(没有保存到数据库)。

谢谢,
Kelly

1 个回答

0

不确定这个问题对最初提问的人来说是否仍然有效:如果是这样的话,还有其他人看到这个内容,也可以参考以下几点建议,帮助你朝着正确的方向前进:

  • 我没有看到一个叫做__init__()的方法去调用父类?比如说:

    def __init__(self, *args, **kwargs): super(SignupForm, self).__init__(*args, **kwargs)

  • 在注册方法中使用用户参数。这个参数应该已经有值,不要再重新加载它。
  • 确保这两个对象正确链接(我没有用Django来建立我的个人资料表,所以可能会有所不同,但我设置了user.profile = Profile(...); 然后在我的signup()方法结束时执行user.profile.save())。
  • 从表单的cleaned_data中获取要放入个人资料的值(例如,使用self.cleaned_data['city']而不是POST的数据)。

然后开始调试:你的signup()方法有没有被调用?它得到了什么?当你执行profile.save()方法时发生了什么?

撰写回答