• Anaconda+django写出第一个web app(七)


    今天来实现如何在页面弹出一些信息,比如注册成功后弹出注册成功的信息。这一点可以通过materialize里的Toasts来实现。

    django自带的messages可以告诉我们是否注册成功,以及注册失败,或者提出警告。我们首先修改views.py,来引入messages:

    from django.shortcuts import render, redirect
    from django.http import HttpResponse
    from .models import Tutorial
    from django.contrib.auth.forms import UserCreationForm
    from django.contrib.auth import login, logout, authenticate
    from django.contrib import messages
    # Create your views here.
    def homepage(request):
        return render(request=request, 
                template_name='main/home.html',
                context={'tutorials':Tutorial.objects.all})
    
    def register(request):
        if request.method == 'POST':
            form = UserCreationForm(request.POST)
            if form.is_valid():
                user = form.save()
                username = form.cleaned_data.get('username')
                messages.success(request, f"New account created: {username}")
                login(request, user)
                return redirect('main:homepage')
            else:
                for msg in form.error_messages:
                    messages.error(request, f"{msg}:{form.error_messages[msg]}")
    
                return render(request=request,
                    template_name='main/register.html',
                    context={'form':form})
    
        form = UserCreationForm
        return render(request=request,
                template_name='main/register.html',
                context={'form':form})

    如果注册成功,我们使用了messages.success来给出信息,如果失败我们使用了messages.error来给出信息。

    接下来我们需要在html文件中使得这些信息可以显示,因为messages不止出现在注册时,所以我们将这些信息写在header.html中,我们还希望在注册成功后,导航栏右上角的文字发生变化,loigin变为刚注册的用户名,register变为logout,修改后header.html的内容如下:

    <head>
    {% load static %}
    <!-- Compiled and minified CSS -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
    
    <!-- Compiled and minified JavaScript -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
    <link href="{% static 'tinymce/css/prism.css' %}" rel="stylesheet">
    </head>
    
    <body>
        {% if messages %}
            {% for message in messages %}
                {% if message.tags == 'success'%}
                    <script>M.toast({html: "{{message}}", classes: 'green rounded', displayLength:2000});</script>
                {% elif message.tags == 'info'%}
                    <script>M.toast({html: "{{message}}", classes: 'blue rounded', displayLength:2000});</script>
                {% elif message.tags == 'warning'%}
                    <script>M.toast({html: "{{message}}", classes: 'orange rounded', displayLength:10000});</script>
                {% elif message.tags == 'error'%}
                    <script>M.toast({html: "{{message}}", classes: 'red rounded', displayLength:10000});</script>
                {% endif %}
            {% endfor %}
        {% endif %}
      <nav>
        <div class="nav-wrapper">
          <a href="#" class="brand-logo">Tutorials</a>
          <ul id="nav-mobile" class="right hide-on-med-and-down">
            <li><a href="/">Home</a></li>
            {% if user.is_authenticated %}
                <li><a href="/account">{{ user.username }}</a></li>
                <li><a href="/logout">Logout</a></li>
            {% else %}
                <li><a href="/login">Login</a></li>
                <li><a href="/register">Register</a></li>
            {% endif %}
          </ul>
        </div>
      </nav>
    
      <div class="container">
          {% block content %}
        {% endblock %}
      </div>
    
    </body>
    
    <script src="{% static 'tinymce/js/prism.js' %}"></script>

     此时的header.html内容显得有些复杂和凌乱,我们可以使用include来将某些代码放入单独的html文件中来缩短header.html的内容,为此我们在templates/main文件夹下新建文件夹includes,然后新建两个文件messages.html和navbaritems.html,最终header.html、messages.html、navbaritems.html内容分别如下:

    <head>
    {% load static %}
    <!-- Compiled and minified CSS -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
    
    <!-- Compiled and minified JavaScript -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
    <link href="{% static 'tinymce/css/prism.css' %}" rel="stylesheet">
    </head>
    
    <body>
      {% include 'main/includes/messages.html' %}
      <nav>
        <div class="nav-wrapper">
          <a href="#" class="brand-logo">Tutorials</a>
          <ul id="nav-mobile" class="right hide-on-med-and-down">
            <li><a href="/">Home</a></li>
            {% include 'main/includes/navbaritems.html' %}
          </ul>
        </div>
      </nav>
    
      <div class="container">
          {% block content %}
        {% endblock %}
      </div>
    
    </body>
    
    <script src="{% static 'tinymce/js/prism.js' %}"></script>
    {% if messages %}
        {% for message in messages %}
            {% if message.tags == 'success'%}
                <script>M.toast({html: "{{message}}", classes: 'green rounded', displayLength:2000});</script>
            {% elif message.tags == 'info'%}
                <script>M.toast({html: "{{message}}", classes: 'blue rounded', displayLength:2000});</script>
            {% elif message.tags == 'warning'%}
                <script>M.toast({html: "{{message}}", classes: 'orange rounded', displayLength:10000});</script>
            {% elif message.tags == 'error'%}
                <script>M.toast({html: "{{message}}", classes: 'red rounded', displayLength:10000});</script>
            {% endif %}
        {% endfor %}
    {% endif %}
    {% if user.is_authenticated %}
        <li><a href="/account">{{ user.username }}</a></li>
        <li><a href="/logout">Logout</a></li>
    {% else %}
        <li><a href="/login">Login</a></li>
        <li><a href="/register">Register</a></li>
    {% endif %}

    在浏览器中刷新页面,仍然正常显示。这种方法可以保证单个文件的内容不至于过长,便于后期管理。本文中刚开始提到的信息提示,没有相应的截图,这个可以在下一节添加login和logout时清楚的观察到。

    参考链接:

    [1] https://materializecss.com/toasts.html

    [2] https://pythonprogramming.net/messages-django-tutorial/

  • 相关阅读:
    Timer类的常见使用方法
    转:HTTP协议简介
    DS-5新加交叉编译工具
    C++的引用
    C++构造函数的几种使用方法
    Eclipse 快捷键
    eclipse Outline里图标的含义
    Linux 内存映射函数 mmap()函数详解
    Sockit 硬件接口编程——点亮一个LED
    更新Preloader与uboot
  • 原文地址:https://www.cnblogs.com/yunxiaofei/p/10424057.html
Copyright © 2020-2023  润新知