制作DJANGO注册页面的最简单方法是什么?

时间:2018-05-31 22:59:03

标签: python django registration cloud9-ide cloud9

我对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>

What My Framework Looks Like

真诚地感谢任何读过这篇文章的人。

1 个答案:

答案 0 :(得分:1)

现在,您有了一个视图login_view,它可以与您的表单UserLoginForm一起使用,以接受一些POST数据并尝试登录用户。您可以重复使用这个逻辑来创建一个创建用户的视图。事实上,由于Django为您定义UserCreationForm,您甚至不必自己制作一个(假设您使用的是默认的身份验证模型):https://docs.djangoproject.com/en/2.0/topics/auth/default/#django.contrib.auth.forms.UserCreationForm

因为这是针对学校项目的,所以我不会为你编写代码,但想一想,你就有了一个好的开始:

  1. 您需要一个将一些POST数据提供给表单的视图 - 您知道如何做到这一点。
  2. 您的观点需要验证该表单 - 您也知道如何执行此操作。由于您使用的是Django的内置表单,因此您还可以使用其内置的验证器。
  3. 您需要将该表单中的数据另存为新用户。这部分将是新的。如果您使用内置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
  4. 现在您有了一个新用户,但您的视图仍需要返回某种响应。接下来会发生什么?呈现欢迎页面,重定向到新位置?由您决定,但请查看您的登录视图 - 您已经知道如何使用上下文呈现任意模板以及如何重定向到另一个视图。你可以做任何事!
  5. 我希望这对你来说是一个跳跃点。阅读ModelForms之后,您应该很好地了解如何实现您所描述的edit视图。尝试一下,然后回到SO并发布您遇到的问题以及您尝试过的代码的具体问题。一个提示,instance是你的朋友。

    最后,您的登录页面看起来很有趣,因为您使用普通{{form}}模板标记呈现表单。您可以使用{{form.as_p}}{{form.as_table}}使其看起来更好(意见各不相同)。为了使它更好,你要么想要单独渲染每个字段(以便你可以控制它们的样式),或者查看django-crispy-forms

相关问题