python - 制作 DJANGO 注册页面的最简单方法是什么?
问题描述
我对 Django 比较陌生,但在过去的一周里我花了无数个小时学习如何制作 webapps。我已经从许多承诺进行用户注册的教程中反弹,但它们都导致我的页面崩溃并变成完全空白和白色。
我现在又重新开始了,但这次我做了一个应用程序 COMPELETY 专门用于用户登录/注销/注册。我终于可以登录了,但这对我没有任何好处,因为我没有任何用户帐户。
我现在只是要求一种非常简单的方法来制作一个用户注册页面,它允许用户创建一个帐户以便查看主页并能够在其上编辑内容。我看过多个教程和文档,真的希望有人能给我一个可靠的答案。
提前致谢。
如果有帮助,这就是我的代码到目前为止的样子:(还值得一提的是我正在使用 Cloud9 IDE)
视图.py
from django.contrib.auth import (
authenticate,
get_user_model,
login,
logout,
)
from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect
from .forms import UserLoginForm
# Create your views here.
def login_view(request):
title = "Login"
form = UserLoginForm(request.POST or None)
if form.is_valid():
username = form.cleaned_data.get("username")
password = form.cleaned_data.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
# or any other success page
# return HttpResponse("Logged in")
return HttpResponseRedirect('accounts/home')
return render(request, "accounts/form.html", {"form":form, "title": title})
表格.py
from django import forms
from django.contrib.auth import (
authenticate,
get_user_model,
login,
logout,
)
User = get_user_model()
class UserLoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
class Meta:
model = User
fields = ('username', 'email', 'password')
def clean(self,*args,**kwargs):
username = self.cleaned_data.get("username")
password = self.cleaned_data.get("password")
user = authenticate(username=username,password=password)
if not user:
raise forms.ValidationError("This user does not exist")
if not user.check_password(password):
raise forms.ValidationError("Incorrect Password")
if not user.is_active:
raise forms.ValidationError("This user is no longer active.")
return super(UserLoginForm, self).clean(*args,**kwargs)
form.html(目前使用这个登录,打开后使用相同格式注册)
{% extends 'accounts/base.html' %}
{% block main_content %}
<div class="container">
<div class='col-sm-6 col-sm-offset-3'>
<h1>{{ title }}</h1>
<form method='POST' action='' enctype='multipart/form-data'>{% csrf_token %}
{{ form }}
<input type='submit' class='btn btn-primary btn-block' value='{{ title }}' />
</form>
</div>
</div>
{% endblock %}
(旁注,我知道这不是我主要要求的一部分,但我的登录页面看起来不像我想要的那样,就像这里的引导登录页面https://getbootstrap.com /docs/4.0/examples/sign-in/ . 这就是现在的样子
如果你能帮我解决这个问题,那对我来说就意味着整个世界。谢谢你。另外,如果您认为这是因为我没有链接到 CSS 页面,那么这就是我的基本模板的外观和结构:
{% load staticfiles %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Accounts</title>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" type="text/css" href="{% static 'accounts/signin.css' %}" />
</head>
<body>
<div class="jumbotron">
<div class="container">
{% block main_content %}
{% endblock %}
</div>
</div>
</body>
</html>
衷心感谢读到这里的人。
解决方案
现在你有一个视图,login_view
,它与你的表单一起工作,UserLoginForm
,接受一些 POST 数据并尝试登录用户。你可以重用这个逻辑的一部分来创建一个创建用户的视图。事实上,由于 DjangoUserCreationForm
为您定义了一个,您甚至不必自己制作一个(假设您使用的是默认身份验证模型):https ://docs.djangoproject.com/en/2.0/topics/auth/默认/#django.contrib.auth.forms.UserCreationForm
由于这是一个学校项目,我不会为你编写代码,但仔细考虑一下,你就有了一个好的开始:
- 您需要一个将一些 POST 数据输入表单的视图——您知道如何做到这一点。
- 您的视图需要验证该表单 - 您也知道如何做到这一点。由于您使用的是 Django 的内置表单,因此您还将拥有其内置的验证器。
- 您需要将该表单中的数据保存为新用户。这部分将是新的。如果您使用内置的
UserCreationForm
,这是一个ModelForm
,您可以使用form.save()
. 您应该阅读ModelForms
以了解为什么会这样:https ://docs.djangoproject.com/en/2.0/topics/forms/modelforms/#django.forms.ModelForm另一方面,如果您决定编写自己的表单,那么您将需要访问该表单数据并使用它手动创建新用户。你知道如何访问你的表单数据——你是在登录视图中进行的——所以你需要做的就是使用这些数据来创建一个用户而不是登录。不要User.objects.create
用来做这个——使用User.objects.create_user
. 阅读本文以了解原因:https://docs.djangoproject.com/en/2.0/ref/contrib/auth/#django.contrib.auth.models.UserManager.create_user - 现在您有了一个新用户,但您的视图仍然需要返回某种响应。接下来应该发生什么?渲染欢迎页面,重定向到新位置?由您决定,但请查看您的登录视图 - 您已经知道如何使用上下文呈现任意模板以及如何重定向到另一个视图。你可以做任何事!
我希望这可以作为你的起点。一旦您阅读了,您应该对如何实现您所描述ModelForms
的视图有一个很好的了解。edit
尝试一下,然后回到 SO 并发布您遇到的问题以及您尝试过的代码的具体问题。一个提示,instance
是你的朋友。
最后,您的登录页面看起来很有趣,因为您使用纯{{form}}
模板标签呈现表单。{{form.as_p}}
您可以使用或使其看起来稍微好一些(意见不同){{form.as_table}}
。为了获得更好的效果,您需要单独渲染每个字段(以便您可以控制它们的样式),或者查看django-crispy-forms
.