2016-04-05 8 views
0

Allauth用の独自のSignupFormを構築しようとしていて、問題が続いています。Allauth SignupFormとUserProfileを上書き保存する

class SocialSignupForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     exclude = ('user',) 

def __init__(self, *args, **kwargs): 
    self.sociallogin = kwargs.pop('sociallogin') 
    user = self.sociallogin.user 

username = forms.CharField(max_length=25, label="Username", help_text='', required=True) 

視覚的に、全く問題なくアップロードのフォーム:私はこのようなforms.pyを試してみました

。しかし、フォームを提出しようとすると、USER_IDはnullエラーとなります。おそらく、保存メソッドは、ユーザーを作成する前にプロファイルを保存しようとしていました。この順序を変更する方法や、signup()メソッドをオーバーライドする方法は、最初の保存後にのみ実行する必要はありません。

他のいくつかの方法(forms.FormとAllAuthのSocialSignUpFormをオーバーライド)を試しましたが、別のエラーセットはありますが、これ以上の運がありません。

ここでの入力/案内はすばらしく、これは私をナットにしています。

答えて

1

私はそれを理解したようProfileは(すなわち、それはAbstractBaseUserから派生)ユーザーモデルでない限り、あなたはここでそれを使用することはできませんので、SocialSignupFormは、Userモデルのフォームをカスタマイズするためにあなたのためのものです。

フォームをカスタマイズしてプロファイル情報を追加する場合は、反対の方向に行う必要があります。あなたのプロフィールに使用するフォームの追加フィールドを定義しますが、それでも実際に

class Meta: 
    model = User # or whatever your User model is 

を維持し、あなたもクラスのMetaを定義し、代わりにSignupFormから派生しないでください。

from allauth.account.forms import SignupForm 
class MySignupForm(SignupForm): 
    ... 

あなたが、その後することができますcustom_signupまたはsave関数を上書きして、ユーザーモデルに基づいてプロファイルモデルを作成しようとします。

またはシグナルを使用してこれを調べます。

+0

それで、私の考え方は完全に変わり、意味が分かりました。私はallauth.socialaccount.forms.SignupFormから継承するフォームをリファクタリングし、すべてを適切に生成するようです。しかし、私のサインアップ(自己、リクエスト、ユーザー)は何もしていないようです。エラーは発生しませんが、プロファイルオブジェクトは実際には保存されません(サインアップが起動しているかどうかわかりません) – Programming123

+0

printステートメントだけでsaveおよびcustom_signupメソッドを追加し、呼び出されるかどうかを確認してください。 – dkarchmer

+0

保存は間違いなく(ユーザ名/メールが保存されているので)発砲しています。登録メッセージにメッセージを追加してみましたが、何も表示されませんでした。私もcustom_saveを上書きしようとします。 printステートメントはどこに表示されますか? – Programming123

関連する問題