Python 如何在Django Allauth表单上重写.signup()

Python 如何在Django Allauth表单上重写.signup(),python,django,forms,registration,django-allauth,Python,Django,Forms,Registration,Django Allauth,我试图在继承自django allauth的SignupForm的表单上重写.signup(),但它似乎不起作用。我的主要目标是在保存User模型的同时保存UserProfile模型的一个实例 以下是我目前掌握的代码: class MySignupForm(SignupForm): """ This form only used for django-allauth package (called in Settings.py) """ first_name = forms.Ch

我试图在继承自django allauth的
SignupForm
的表单上重写
.signup()
,但它似乎不起作用。我的主要目标是在保存
User
模型的同时保存
UserProfile
模型的一个实例

以下是我目前掌握的代码:

class MySignupForm(SignupForm):
    """ This form only used for django-allauth package (called in Settings.py) """
    first_name = forms.CharField(max_length=30, widget=forms.TextInput(attrs={'placeholder': 'First name'}))
    last_name = forms.CharField(max_length=30, widget=forms.TextInput(attrs={'placeholder': 'Last name'}))
    dob = forms.CharField(widget=forms.TextInput(attrs={'type': 'date', 'min': '1940-01-01', 'max': '2030-01-01'}))  # HTML5 Widget... works?

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

        login_url = reverse_lazy('account_login')

        self.helper = FormHelper()
        self.helper.layout = Layout(
            Div('first_name', css_class='col-md-6'),
            Div('last_name', css_class='col-md-6'),
            Div('dob', css_class='col-md-12', style='clear: both'),
            Div('username', css_class='col-md-12', style='clear: both'),
            Div('email', css_class='col-md-12'),
            Div('password1', css_class='col-md-12', style='clear: both'),
            Div('password2', css_class='col-md-12'),
            HTML('<div class="col-md-12"><br></div>'),

            FormActions(
                Submit('submit', 'Register', css_class='btn btn-primary', style='display:block;clear:both;margin: 0 0 15px 15px;float:left'),
                HTML('<a href="{0}" class="btn btn-default" style="margin: 0 15px 15px 0;float:right;display:inline">Sign In</a>'.format(login_url))
            )
        )

    def signup(self, request, user):
        print(form.cleaned_data['dob'])
        return user 
类MySignupForm(SignupForm):
“”“此表单仅用于django allauth包(在Settings.py中调用)”
first_name=forms.CharField(最大长度=30,小部件=forms.TextInput(attrs={'placeholder':'first name'}))
last_name=forms.CharField(max_length=30,widget=forms.TextInput(attrs={'placeholder':'last name'}))
dob=forms.CharField(widget=forms.TextInput(attrs={'type':'date','min':'1940-01-01','max':'2030-01-01'}))#HTML5小部件。。。作品
定义初始化(self,*args,**kwargs):
super()
login\u url=reverse\u lazy('account\u login')
self.helper=FormHelper()
self.helper.layout=布局(
Div('first_name',css_class='col-md-6'),
Div('last_name',css_class='col-md-6'),
Div('dob',css_class='col-md-12',style='clear:tware'),
Div('username',css_class='col-md-12',style='clear:both'),
分区(“电子邮件”,css_class='col-md-12'),
Div('password1',css_class='col-md-12',style='clear:both'),
Div('password2',css_class='col-md-12'),
HTML(“
”), 形态( 提交('Submit','Register',css_class='btn btn primary',style='display:block;clear:both;margin:0 0 15px 15px;float:left'), HTML(“”.format(登录地址)) ) ) def注册(自我、请求、用户): 打印(表单数据['dob']) 返回用户

正如您所看到的,我正在尝试
print()
dob,但是当我尝试注册时,我的终端中没有显示任何内容!任何帮助都将不胜感激。

您需要在设置中使用此选项。py

ACCOUNT_SIGNUP_FORM_CLASS = 'yourproject.yourapp.forms.SignupForm'
编辑

您可以使用post_save信号创建userprofile实例

from django.db.models.signals import post_save

@receiver(post_save, sender=User, weak=False, dispatch_uid='models.create_userprofile')
def create_userprofile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

您需要在settings.py中使用此选项

ACCOUNT_SIGNUP_FORM_CLASS = 'yourproject.yourapp.forms.SignupForm'
编辑

您可以使用post_save信号创建userprofile实例

from django.db.models.signals import post_save

@receiver(post_save, sender=User, weak=False, dispatch_uid='models.create_userprofile')
def create_userprofile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

实际上我已经这样做了-自定义字段显示在我的注册表中,但是
print()
语句没有打印,这意味着它没有在注册时执行。@我不确定您是否已经尝试过,但您可以收听post\u save信号。请参见上面的我的编辑还有
pre\u social\u login
signal.->
从allauth.socialaccount.signals导入pre_social_login
这种方法的问题是我将失去对
dob
字段的访问权,我需要将该字段保存在
UserProfile
模型中,而不是
User
model我实际上已经这样做了-我的注册表中显示了自定义字段,但是
print()
语句未打印,这意味着注册时未执行该语句。@我不确定您是否已经尝试过,但您可以收听post_保存信号。请参见上面的我的编辑还有
pre\u social\u login
signal.->
从allauth.socialaccount.signals导入pre_social_login
此方法的问题是我将失去对
dob
字段的访问权限,我需要将其保存在
UserProfile
模型中,而不是
User
模型中