将登录和注册合并到django中的一个视图中

时间:2016-08-26 07:36:21

标签: django

将登录/注册视图合并到一个视图中,比如LoginSignupView,因为我在一个模板中有登录,注册表单。

我提到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':'dave@dave.com'}

    def get_signup_initial(self):
        return {'email':'dave@dave.com'}

    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 %}

首先,我测试创建用户(注册),但是当我提交按钮时,它不会创建新用户。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

您的代码太多,无法通过,并且有很多线路可以应对简单的挑战。有很多选择。

  1. 创建自定义视图,而不是使用Form Mixins。他们写起来和理解起来会容易得多。确定每种形式的隐藏输入提交的表单。
  2. 使用Mixins创建2个视图,每个视图用于登录和注册,并修改表单的操作部分以分别提交到正确的视图。
  3. 希望它有所帮助。