Django内嵌的html页面显示主页面的变量

比如有两个页面a.html和b.html a.html里面使用{% include b.html %},然后在b.html里面使用a.html的view里面数据库的查询

a.html 的view文件

class HomePageView(TemplateView):
template_name = 'home.html'


def home(request):
allcategory = TypeList.objects.all()#通过Category表查出所有分类
print ("this is home device function")
#把查询出来的分类封装到上下文里
context = {
'allcategory': allcategory,
}
return render(request, 'home.html', context)#把上下文传到index.html页面
b.html里面是这个样子的:
<ul>

{% for device in allcategory %}
<li> {{device.type}} </li>
{% endfor %}

</ul>

关键的部分其实是在网站urls.py文件的定义里面,也就是网站启动的时候是不会启动这个home函数的,那么我们认为的把url修改成直接启动这个函数:
urlpatterns = [

path('',views.home),

]


Django后台添加管理内容

比如在后台添加一些用户看不见的内容,但是对网站运行需要的信息。下面就建立一个MQTT服务器的信息

1. Django-admin startapp mqtt

2.  打开新建目录下面的model文件,输入内容

from django.db import models
class MQTTHOST(models.Model):
name = models.CharField('name', max_length=100)
ip = models.CharField('ip', max_length=100)
port = models.CharField('port', max_length=100)

class Meta:
verbose_name = 'MQTT主机'
verbose_name_plural = verbose_name

def __str__(self):
return self.ip
3. 打开mqtt目录下面的admin.py输入
from django.contrib import admin
from .models import MQTTHOST

@admin.register(MQTTHOST)

class MQTTHOSTAdmin(admin.ModelAdmin):
list_display = ('name', 'ip', 'port')
4. 打开mqtt下面的app输入内容如下
from django.apps import AppConfig


class MqttConfig(AppConfig):
name = 'mqtt'
5. 打开setting 文件,在下面增加mqtt.apps.MqttConfig
INSTALLED_APPS = [
  ……
'mqtt.apps.MqttConfig'
]
6. 终端中输入python manage.py makemigrations
7. 终端中输入python manage.py migrate
8. 运行一下看看 python manage.py runserver

不得不说,Django做网站确实太轻松了,一旦你掌握它的规则,新建一个功能是非常轻松的。

Django登陆Admin后台错误的解决方案

最近学习使用Django来做网站,但是遇到一个问题,就是无法通过localhost:8000/admin来登陆后台,提示连接错误。但是如果输入错误的用户名的话,会提示你用户名或者密码错误,也就是说你输入正确了,需要跳转的时候就会出问题。在网络上找了不少的解决方案,但是都不能解决我的问题,除了下面这个。

1. 下载pipenv

2. $ pipenv shell

3. (code) $ django-admin startproject emaillogin_project #开始建立一个新的项目

4. (code) $ python manage.py startapp users #开始建立一个新的app, 叫做users

5. 更改项目的设定的文件,也就是setting.py,注意,红色部分就是新增加的

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',

# 3rd party
'allauth',
'allauth.account',
'allauth.socialaccount',

# Local
'users.apps.UsersConfig',
'pages.apps.PagesConfig',

]
# emaillogin_project/settings.py
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

AUTHENTICATION_BACKENDS = (
    # Needed to login by username in Django admin, regardless of `allauth`
    "django.contrib.auth.backends.ModelBackend",

    # `allauth` specific authentication methods, such as login by e-mail
    "allauth.account.auth_backends.AuthenticationBackend",
)

SITE_ID = 1

ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE = False
ACCOUNT_SESSION_REMEMBER = True
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_UNIQUE_EMAIL = True
6.(code) $ pipenv install django-allauth #安装这个第三方的插件,我直接pip安装
7. (code) $ python manage.py migrate
8. 项目urls文件里面是这样的。
from django.contrib import admin
from django.urls import path, include # new

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('allauth.urls')), # new
9. 当然还有模块文件夹和模块等等。。。
(code) $ mkdir templates
(code) $ mkdir templates/account
(code) $ touch templates/account/login.html
(code) $ touch templates/account/signup.html
<!-- templates/account/login.html -->
<h2>Log In</h2>
<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Log In</button>
</form>
<!-- templates/account/signup.html -->
<h2>Sign Up</h2>
<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Sign Up</button>
</form>
10. (code) $ python manage.py startapp pages #新建页面app
11. 。。。。太多内容了。其实git上有一个代码,下载下来就能用了。 

https://github.com/wsvincent/django-login-with-email

我用了这个代码以后,刚开始也不行,然后admin神奇的就可以用了。以为是电脑的环境变化了,重新新建一个项目,但是还是不能工作,重新用这个代码,然后还是可以使用。

这个代码的好处不仅是解决了后台的问题,同时给了我们一个新用户注册和登陆的解决方案,其他的内容可以在这个基础上增加即可。