2016-08-26 1 views
-1

하나의보기에 로그인/가입보기를 통합합니다 (예 : LoginSignupView). 한 템플릿에 로그인, 가입 양식이 있기 때문에 말하십시오.django에서 하나의보기로 로그인 및 가입

나는 https://gist.github.com/jamesbrobb/748c47f46b9bd224b07f을 대해 참조하지만 (사실 나는 그것이 어떻게 작동하는지 모르겠어요)가 작동하지 않습니다 생각

views.py :

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 개의보기를 만들고 양식의 작업 부분을 수정하여 각각 올바른보기로 제출하십시오.

희망이 있습니다.

관련 문제