我对Django来说相对较新,但过去一周花了无数个小时学习如何制作webapps。我已经从许多承诺进行用户注册的教程中蹦蹦跳跳,但他们都让我的页面崩溃并完全变成空白和白色。
我现在又重新开始了,但这次我创建了一个专注于用户登录/注销/注册的app COMPELETY。我终于登录了我的工作,但由于我没有任何用户帐户,这对我没有好处。
我现在只是要求 非常简单 的方式让我创建一个用户注册页面,它允许用户创建一个帐户,以便查看主页并能够编辑其中的内容。我已经看过多个教程和documentations,我真的希望有人能给我一个可靠的答案。
提前致谢。
如果有帮助,这就是我的代码到目前为止的样子:(还值得一提的是我使用的是Cloud9 IDE)
views.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})
forms.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/。这是what it looks like right now
如果你可以帮我解决这个问题,那对我来说就是世界。谢谢。另外,如果您认为这是因为我没有链接到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>
真诚地感谢任何读过这篇文章的人。
答案 0 :(得分:1)
现在,您有了一个视图login_view
,它可以与您的表单UserLoginForm
一起使用,以接受一些POST数据并尝试登录用户。您可以重复使用这个逻辑来创建一个创建用户的视图。事实上,由于Django为您定义UserCreationForm
,您甚至不必自己制作一个(假设您使用的是默认的身份验证模型):https://docs.djangoproject.com/en/2.0/topics/auth/default/#django.contrib.auth.forms.UserCreationForm
因为这是针对学校项目的,所以我不会为你编写代码,但想一想,你就有了一个好的开始:
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
。