2016-08-26 4 views
-1

ログイン/サインアップビューを1つのビューにマージすると、LoginSignupViewと表示されます。djangoの1つのビューへのログインとサインアップ

私は私のviews.py

(実際に私はそれがどのように動作するか分からない) https://gist.github.com/jamesbrobb/748c47f46b9bd224b07fを参照さが、それは動作しないと思います:

from django.views.generic.base import ContextMixin, TemplateResponseMixin 
from django.views.generic.edit import ProcessFormView 
from django.http.response import HttpResponseRedirect, HttpResponseForbidden 
from django.contrib.auth.forms import AuthenticationForm 


from users.forms import MyUserCreationForm 

class MultiFormMixin(ContextMixin): 

    form_classes = {} 
    prefixes = {} 
    success_urls = {} 
    grouped_forms = {} 

    initial = {} 
    prefix = None 
    success_url = None 

    def get_form_classes(self): 
     return self.form_classes 

    def get_forms(self, form_classes, form_names=None, bind_all=False): 
     return dict([(key, self._create_form(key, klass, (form_names and key in form_names) or bind_all)) \ 
      for key, klass in form_classes.items()]) 

    def get_form_kwargs(self, form_name, bind_form=False): 
     kwargs = {} 
     kwargs.update({'initial':self.get_initial(form_name)}) 
     kwargs.update({'prefix':self.get_prefix(form_name)}) 

     if bind_form: 
      kwargs.update(self._bind_form_data()) 

     return kwargs 

    def forms_valid(self, forms, form_name): 
     form_valid_method = '%s_form_valid' % form_name 
     if hasattr(self, form_valid_method): 
      return getattr(self, form_valid_method)(forms[form_name]) 
     else: 
      return HttpResponseRedirect(self.get_success_url(form_name)) 

    def forms_invalid(self, forms): 
     return self.render_to_response(self.get_context_data(forms=forms)) 

    def get_initial(self, form_name): 
     initial_method = 'get_%s_initial' % form_name 
     if hasattr(self, initial_method): 
      return getattr(self, initial_method)() 
     else: 
      return self.initial.copy() 

    def get_prefix(self, form_name): 
     return self.prefixes.get(form_name, self.prefix) 

    def get_success_url(self, form_name=None): 
     return self.success_urls.get(form_name, self.success_url) 

    def _create_form(self, form_name, klass, bind_form): 
     form_kwargs = self.get_form_kwargs(form_name, bind_form) 
     form_create_method = 'create_%s_form' % form_name 
     if hasattr(self, form_create_method): 
      form = getattr(self, form_create_method)(**form_kwargs) 
     else: 
      form = klass(**form_kwargs) 
     return form 

    def _bind_form_data(self): 
     if self.request.method in ('POST', 'PUT'): 
      return{'data': self.request.POST, 
        'files': self.request.FILES,} 
     return {} 


class ProcessMultipleFormsView(ProcessFormView): 

    def get(self, request, *args, **kwargs): 
     form_classes = self.get_form_classes() 
     forms = self.get_forms(form_classes) 
     return self.render_to_response(self.get_context_data(forms=forms)) 

    def post(self, request, *args, **kwargs): 
     form_classes = self.get_form_classes() 
     form_name = request.POST.get('action') 
     if self._individual_exists(form_name): 
      return self._process_individual_form(form_name, form_classes) 
     elif self._group_exists(form_name): 
      return self._process_grouped_forms(form_name, form_classes) 
     else: 
      return self._process_all_forms(form_classes) 

    def _individual_exists(self, form_name): 
     return form_name in self.form_classes 

    def _group_exists(self, group_name): 
     return group_name in self.grouped_forms 

    def _process_individual_form(self, form_name, form_classes): 
     forms = self.get_forms(form_classes, (form_name,)) 
     form = forms.get(form_name) 
     if not form: 
      return HttpResponseForbidden() 
     elif form.is_valid(): 
      return self.forms_valid(forms, form_name) 
     else: 
      return self.forms_invalid(forms) 

    def _process_grouped_forms(self, group_name, form_classes): 
     form_names = self.grouped_forms[group_name] 
     forms = self.get_forms(form_classes, form_names) 
     if all([forms.get(form_name).is_valid() for form_name in form_names.values()]): 
      return self.forms_valid(forms) 
     else: 
      return self.forms_invalid(forms) 

    def _process_all_forms(self, form_classes): 
     forms = self.get_forms(form_classes, None, True) 
     if all([form.is_valid() for form in forms.values()]): 
      return self.forms_valid(forms) 
     else: 
      return self.forms_invalid(forms) 


class BaseMultipleFormsView(MultiFormMixin, ProcessMultipleFormsView): 
    """ 
    A base view for displaying several forms. 
    """ 

class MultiFormsView(TemplateResponseMixin, BaseMultipleFormsView): 
    """ 
    A view for displaying several forms, and rendering a template response. 
    """ 





class LoginSignupView(MultiFormsView): 
    template_name = 'users/login_signup.html' 
    form_classes = {'login': AuthenticationForm, 
        'signup': MyUserCreationForm} 
    success_url = '/' 

    def get_login_initial(self): 
     return {'email':'[email protected]'} 

    def get_signup_initial(self): 
     return {'email':'[email protected]'} 

    def get_context_data(self, **kwargs): 
     context = super(LoginSignupView, self).get_context_data(**kwargs) 
     context.update({"some_context_value": 'blah blah blah', 
         "some_other_context_value": 'blah'}) 
     return context 

    def login_form_valid(self, form): 
     return form.login(self.request, redirect_url=self.get_success_url()) 

    def signup_form_valid(self, form): 
     user = form.save(self.request) 
     return form.signup(self.request, user, self.get_success_url()) 

テンプレート:login_signup.html

{% extends 'chacha_dabang/skeleton/base.html' %} 

{% load pipeline%} 

{% block content %} 
    <div class="container"> 
     <div id="loginbox" class="mainbox"> 
      <div class="panel panel-info"> 
       <div class="panel-heading"> 
        <div class="panel-title">Sign In</div> 
       </div> 

       <div class="panel-body"> 
        <div id="login-alert" class="alert alert-danger col-sm-12"></div> 
        <form id="loginform" class="form-horizontal" role="form" method="post" action="{% url 'users:login_signup' %}"> 
         {% csrf_token %} 
         <!-- id/pw --> 
         <div class="input-group"> 
          <span class="input-group-addon"><i class="icon-user"></i></span> 
          <input id="id_username" type="text" class="form-control" name="username" value="" placeholder="username"> 
         </div> 
         <div class="input-group"> 
          <span class="input-group-addon"><i class="icon-lock"></i></span> 
          <input id="id_password" type="password" class="form-control" name="password" placeholder="password"> 
         </div> 

         <div class="form-group"> 
          <!-- Button --> 
          <div class="btn-controls"> 
           <div class="row"> 
            <input id="btn-login" class="btn btn-success" type="submit" name="login_submit" value="로 그 인" /> 
            <a id="btn-fblogin" href="{% url 'social:begin' backend='facebook' %}" class="btn btn-primary col-xs-12"><i class="icon-facebook"></i> 1초만에 페이스북으로 로그인 </a> 
           </div> 
          </div> 
         </div> 

         <div class="form-group"> 
          <div class="col-md-12 control"> 
           <div class="signup"> 
            아직 차차다방 회원이 아니세요? &nbsp 
            <a href="#" id="signuplink"> 가입하기 </a> 
           </div> 
           <div class="forget"> 
            <a href="#"> 비밀번호를 잊어버리셨나요? </a> 
           </div> 
          </div> 
         </div> 
        </form> 
       </div> <!-- <div class="panel-body" > --> 

      </div> <!-- <div class="panel panel-info"> --> 
     </div> <!-- <div id="loginbox"> --> 


     <!-- Sign up Form --> 
     <div id="signupbox" class="mainbox"> 
      <div class="panel panel-info"> 
       <div class="panel-heading"> 
        <div class="panel-title">Sign Up</div> 
       </div> 

       <div class="panel-body"> 
        <form id="signupform" class="form-horizontal" role="form" method="post" action="{% url 'users:login_signup' %}"> 
         {% csrf_token %} 
         <!-- signup --> 
         <div id="signupalert" class="alert alert-danger"> 
          <p>Error:</p> 
          <span></span> 
         </div> 

         {{ forms.signup.as_p }} 

         <!-- 
         <div class="form-group"> 
          <label for="id_username" class="col-md-3 control-label"> 아이디: </label> 
          <div class="col-md-9"> 
           {{ form.username }} 
          </div> 
         </div> 
         --> 

         <div class="form-group"> 
          <!-- Button --> 
          <div class="btn-controls"> 
           <div class="row"> 
            <input id="btn-signup" class="btn btn-success" type="submit" name="signup_submit" value="가 입 하 기" /> 
            <a id="btn-fblogin" href="{% url 'social:begin' backend='facebook' %}" class="btn btn-primary col-xs-12"><i class="icon-facebook"></i>1초만에 페이스북으로 로그인</a> 
           </div> 
          </div> 
         </div> 

         <div class="form-group"> 
          <div class="col-md-12 control"> 
           <div class="login"> 
            이미 차차다방 회원이신가요? &nbsp 
            <a href="#" id="loginlink"> 로그인하기 </a> 
           </div> 
          </div> 
         </div> 
        </form> 
       </div> <!-- <div class="panel-body"> --> 

      </div> <!-- <div class="panel panel-info"> --> 
     </div> <!-- <div id="signupbox"> --> 

    </div> <!-- <div class="container"> --> 
{% endblock %} 

{% block custom_js %} 
    {% javascript "account" %} 
{% endblock %} 

まず、ユーザー(サインアップ)の作成をテストしますが、ボタンを送信すると新しいユーザーは作成されません。

私には何が欠けていますか?

答えて

0

あなたのコードは行き過ぎであり、単純なチャレンジのためにたくさんの行があります。多くのオプションがあります。

  1. フォームミックスを使用する代わりにカスタム表示を作成します。彼らは書いて理解するのがはるかに簡単です。各フォームの隠れた入力によって提出されたフォームを特定する。
  2. Mixinsを使用して2つのビューを作成し、それぞれログインとサインアップを行い、フォームのアクション部分を修正してそれぞれ正しいビューに送信します。

希望します。

関連する問題