2017-06-11 16 views
0

非常にDjangoの新機能です。私はカスタムフォーム入力でユーザー登録プロセスを作成しようとしています。しかし、データベースへの新規ユーザーの一般的な永続性にはいくつかの問題があります。これは私が私のforms.pyで定義されたものです:Djangoユーザー登録 - 何が間違っているのかわからない

class UserRegistrationForm(UserCreationForm): 
    required_css_class = 'required' 
    email = forms.EmailField() 
    first_name = forms.CharField() 
    last_name = forms.CharField() 

    class Meta: 
     model = User 
     fields = ('username', 'email', 'first_name', 'last_name') 

    def __init__(self, *args, **kwargs): 
     super(UserRegistrationForm, self).__init__(*args, **kwargs) 
     self.fields['username'].widget = TextInput(attrs={'placeholder': 'Username'}) 
     self.fields['username'].required = True 
     self.fields['username'].error_messages = {'required': 'Please enter your username'} 

     self.fields['email'].widget = EmailInput(attrs={'placeholder': 'Email'}) 
     self.fields['email'].required = True 
     self.fields['email'].error_messages = {'required': 'Please enter your email'} 

     self.fields['first_name'].widget = TextInput(attrs={'placeholder': 'Forename'}) 
     self.fields['first_name'].required = True 
     self.fields['first_name'].error_messages = {'required': 'Please enter your first_name'} 

     self.fields['last_name'].widget = TextInput(attrs={'placeholder': 'Surname'}) 
     self.fields['last_name'].required = True 
     self.fields['last_name'].error_messages = {'required': 'Please enter your last_name'} 

     self.fields['password1'].widget = PasswordInput(attrs={'placeholder': 'Password'}) 
     self.fields['password1'].required = True 
     self.fields['password1'].error_messages = {'required': 'Please enter your Password'} 

     self.fields['password2'].widget = PasswordInput(attrs={'placeholder': 'Confirm password'}) 
     self.fields['password2'].required = True 
     self.fields['password2'].error_messages = {'required': 'Please confirm your Password'} 

私も、私のviews.pyファイルに次の持っている:それはdoesnの

  1. :心配何

    class UserRegistrationView(FormView): 
        disallowed_url = '' 
        form_class = UserRegistrationForm 
        success_url = '/blog' 
        template_name = 'oauth/user/registration_form.html' 
    
        def registration_allowed(self): 
         return getattr(settings, 'REGISTRATION_OPEN', True) 
    
        def register(self, request): 
         if request.method == 'POST': 
          form = UserRegistrationForm(request.POST) 
          if form.is_valid(): 
           new_user = form.save(commit=False) 
           new_user.set_password(form.cleaned_data['password1']) 
           new_user.save() 
    
           return render(request, 'blog/post/list.html', { 'new_user': new_user }) 
         else: 
          return render(request, 'oauth/user/registration_form.html', { 'form': form }) 
    
        def get_success_url(self, user=None): 
         return super(UserRegistrationView, self).get_success_url() 
    

    データベースに新しいユーザーを作成してログインします(一般管理者ダッシュボードで新しく作成されたユーザーを表示する必要がありますか?)

  2. スーパーユーザーでサインインできますr! (私は本当にそのような1ビットを取得しないように、真剣に私が試してもそれを書くことはできませんでした!)

私が間違っていた可能性がありますすべてのヘルプは大いに感謝します!

答えて

0

クラスベースのビューと関数ベースのビューが混乱しています。クラスベースのビューには "register"というメソッドはありません。あなたは決して呼び出されません。

実際に書いた方法は、それ自体が完全な関数ベースのビューです。クラスから抽出し、selfパラメータを削除し、関数を直接呼び出すようにurlconfを変更すると、うまくいきます。

+0

私はそれをクラスベースのビューにするためにどのような方法で呼び出すことができますか?あなたが知っているクラスベースのレジスタビューの例はありますか? –

+0

多くの。しかしまずは、ドキュメントやccbv.co.ukのようなクラスベースのビューの仕組みを理解する必要があります。たとえば、そのレジスタメソッドのほとんどのコードは、ビューがあなたのために実行するので、無関係です。実際のユーザ作成は 'form_valid'になります。 –

+0

Hmmm、ccbv.co.ukには、クラスベースのユーザー登録ビューの例は含まれていません。 –

0

postメソッドを作成します(またはpostregisterの名前を変更する)とas_view()があなたのクラスに何をすべきか知っているように、あなたのクラスに追加します。それをあなたのurlconfにビューとして追加してください。

class UserRegistrationView(FormView): 
    disallowed_url = '' 
    form_class = UserRegistrationForm 
    success_url = '/blog' 
    template_name = 'oauth/user/registration_form.html' 

    def post(self, request, *arg, **kwargs): 
     return self.register(request) 

    def registration_allowed(self): 
     return getattr(settings, 'REGISTRATION_OPEN', True) 

    def register(self, request): 
     if request.method == 'POST': 
      form = UserRegistrationForm(request.POST) 
      if form.is_valid(): 
       new_user = form.save(commit=False) 
       new_user.set_password(form.cleaned_data['password1']) 
       new_user.save() 

       return render(request, 'blog/post/list.html', {'new_user': new_user}) 
     else: 
      return render(request, 'oauth/user/registration_form.html', {'form': form}) 

    def get_success_url(self, user=None): 
     return super(UserRegistrationView, self).get_success_url() 

その後、のあなたurls

urlpatterns = [ 
     # . . . 
     url(r'^register_user/$', UserRegistrationView.as_view(), name='register_user'), 
     # . . . 
] 

またgetメソッドを追加し、1つのビュークラスに含まれているフォームロジックのすべてを維持することに興味がある場合は、フォームをレンダリングするためにそれを使用することができます。