我很欣赏一些代码审查,我使用了django-registration app和django.contrib.auth模块。我想要做的是在索引页面上同时拥有登录和注册表单,并从那里进行管理。我做的是我只是复制了registration.views.py和contrib.auth.views.py中的代码并将它们组合在一起。
它有效,但我觉得它非常黑客,非常优雅,还有另一种正确的方法。例如,我觉得在注册和auth中调用或扩展视图方法而不是复制粘贴它们可能会更好。
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>
答案 0 :(得分:2)
在索引页面(或每个页面)上放置登录或注册表单是很自然的,但为什么需要在那里处理表单?在/auth/login/
上处理登录,/auth/registration/
上的流程注册,您的代码将是干净且可扩展的。