django-registration,注册和登录表单上的索引页在一起,我做对了吗?



我希望你能帮我检查一下代码,我使用了django-registration app和django.contrib.auth模块。我想做的是在索引页上有登录和注册表单,并从那里管理它。我所做的就是从registration.views.py和contrib.auth.views.py中复制代码,然后把它们拼凑在一起。

它是有效的,但我觉得它很粗糙,不优雅,还有另一种正确的方法。例如,我觉得在注册和认证中调用或扩展视图方法而不是复制粘贴它们可能会更好。

def index(request, success_url=None,
             form_class=RegistrationForm,
             authentication_form=AuthenticationForm,
             profile_callback=None,
             template_name='index.html',
             extra_context=None, **kwargs):
    redirect_to = request.REQUEST.get('next', '')
    if request.method == 'POST':
        form = form_class(data=request.POST, files=request.FILES)
        form_auth = authentication_form(data=request.POST)
        if form.is_valid():
            new_user = form.save(profile_callback=profile_callback)
            # success_url needs to be dynamically generated here; setting a
            # a default value using reverse() will cause circular-import
            # problems with the default URLConf for this application, which
            # imports this file.
            return HttpResponseRedirect(success_url or reverse('registration_complete'))
        if form_auth.is_valid():
            netloc = urlparse.urlparse(redirect_to)[1]
            # Use default setting if redirect_to is empty
            if not redirect_to:
                #redirect_to = settings.LOGIN_REDIRECT_URL
                redirect_to = "/"
            # Security check -- don't allow redirection to a different
            # host.
            elif netloc and netloc != request.get_host():
                #redirect_to = settings.LOGIN_REDIRECT_URL
                redirect_to = "/"
            # Okay, security checks complete. Log the user in.
            auth_login(request, form_auth.get_user())
            if request.session.test_cookie_worked():
                request.session.delete_test_cookie()
            return HttpResponseRedirect(redirect_to)
    else:
        form = form_class()
        form_auth = authentication_form()

    if extra_context is None:
        extra_context = {}
    context = RequestContext(request)
    for key, value in extra_context.items():
        context[key] = callable(value) and value() or value
    return render_to_response(template_name,
                              { 'form': form, 'form_auth': form_auth},
                              context_instance=context) 

和index.html:

中的表单
    {% if form.errors %}
        <p class="errors">Please correct the errors below: {{ form.non_field_errors }}</p>
    {% endif %}
    <h3>Create an account</h3>
    <form method="post" action="" class="wide">
    {% csrf_token %}
        <p>
          <label for="id_username">Your Username:</label>
          {% if form.username.errors %}
            <p class="errors">{{ form.username.errors.as_text }}</p>
          {% endif %}
          {{ form.username }}
        </p>
        <p>
          <label for="id_email">Email address:</label>
          {% if form.email.errors %}
            <p class="errors">{{ form.email.errors.as_text }}</p>
          {% endif %}
          {{ form.email }}
        </p>
        <p>
          <label for="id_password1">Password:</label>
          {% if form.password1.errors %}
            <p class="errors">{{ form.password1.errors.as_text }}</p>
          {% endif %}
          {{ form.password1 }}
        </p>
        <p>
          <label for="id_password2">Password (type again to catch typos):</label>
          {% if form.password2.errors %}
            <p class="errors">{{ form.password2.errors.as_text }}</p>
          {% endif %}
          {{ form.password2 }}
        </p>
        <p class="submit"><input type="submit" value="Register"></p>
    </form>
    {% if form_auth.errors %}
    <p class="error">Please correct the errors below:</p>
    {% endif %}

    <h3>Log in</h3>
    <form method="post" action="?next={{ next|default:"/" }}">
    {% csrf_token %}
    <dl>
    <dt><label for="id_username">Username:</label>{% if form.username.errors %} <span class="error">{{ form.username.errors|join:", " }}</span>{% endif %}</dt>
    <dd>{{ form_auth.username }}</dd>
    <dt><label for="id_password">Password:</label>{% if form.password.errors %} <span class="error">{{ form.password.errors|join:", " }}</span>{% endif %}</dt>
    <dd>{{ form_auth.password }}</dd>
    <dt><input type="submit" value="Log in" /></dt>
    </dl>
    </form>

将登录或注册表单放在索引页(或每个页面)上是很自然的,但是为什么需要在那里处理表单呢?在/auth/login/上处理登录,在/auth/registration/上处理注册,您的代码将是干净的和可扩展的。

相关内容