1. 官方中文文档

Django 文档 | Django 文档 | Django (djangoproject.com)

2. 第一个应用 博客

总目录

 

<1>依赖安装:

pip install django

<2> 创建 工程 myapp

django-admin startproject myapp
cd myapp

<3>创建 应用 app

> python manage.py startapp app 

<4> 配置模型生成数据库表 

配置数据库: myapp/settings.py

对应文件: app/models.py

python manage.py makemigrations 
python manage.py migrate

<5> 配置文件\路由\视图

<6> 配置 后台

主要文件: app/admin.py

生成管理员账号:

python manage.py createsuperuser

账号:admin

邮箱:admin@qq.com

密码:abc123

<7> 运行服务器

python manage.py runserver

python manage.py runserver 0.0.0.0:8080

<8> 美化 后台页面

pip install django-simpleui

myapp/setting.py 

INSTALLED_APPS = [
    'simpleui', # 注意这里
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    ...     
]

3. 文件参考例:

app/templates/app/post_list.html

<!DOCTYPE html>
<html>
<head>
    <title>Blog</title>
{% load static %}

   <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>
    <h1>博客</h1>
    {% for post in posts %}
        <div>
            <h2><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h2>
            <p>{{ post.content|truncatewords:30 }}</p>
            <p>{{post.f_name}} 发布于 </p>
        </div>
    {% endfor %}

<img  class="bd-placeholder-img" width="200" height="250" src="{{ post.icon2.url }}" alt="" srcset="">
</body>
</html>

app/templates/app/post_detail.html

<!DOCTYPE html>
<html>
<head>
    <title>{{ post.title }}</title>
</head>
<body>
    <img src="{{ post.image.url}}" alt="" srcset="">
    <h1>{{ post.title }}</h1>
    <p>{{ post.content }}</p>
    <p>Published: {{ post.created_at }}</p>
</body>
</html>

app/admin.py

# from django.contrib import admin

# Register your models here.
from django.contrib import admin
from .models import Post, pru ,Netsite

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'author','other','created_at', 'updated_at', 'publish_date')


class PruAdmin(admin.ModelAdmin):
    list_display = ('title','p_name', 'P_jg','p_sl')
admin.site.register(pru, PruAdmin)

admin.site.site_header='BPC管理后台'
admin.site.site_title='BPC管理后台'
admin.site.index_title='BPC管理后台'

class NetAdmin(admin.ModelAdmin):
    list_display = ('title', 'content')

admin.site.register(Netsite, NetAdmin) 

 

 

  1. ModelAdmin类的常用属性概述
    • admin.py文件中,主要是通过定义ModelAdmin类来定制模型在Django管理界面中的显示和行为。
  1. list_display属性
from django.contrib import admin
from.models import Book

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'publication_date')
admin.site.register(Book, BookAdmin)
    • 定义:它是一个元组或列表,用于指定在管理界面的模型列表视图中显示的字段。
    • 示例:假设你有一个Book模型,包含titleauthorpublication_date字段。
    • 在管理界面的书籍列表视图中,将显示每本书的标题、作者和出版日期。
  1. list_filter属性
class BookAdmin(admin.ModelAdmin):
    list_filter = ('author', 'publication_date__year')
    • 定义:这是一个元组或列表,用于在管理界面的模型列表视图中添加过滤器。
    • 示例:对于Book模型,如果你想按作者和出版年份过滤。
    • 这样,在管理界面的书籍列表旁边会出现过滤器,用户可以根据作者姓名和出版年份筛选书籍。
  1. search_fields属性
class BookAdmin(admin.ModelAdmin):
    search_fields = ('title', 'author__name')
    • 定义:它是一个元组或列表,用于在管理界面的模型列表视图中添加搜索框,允许用户通过指定字段的值进行搜索。
    • 示例
    • 这里假设author是一个关联模型,有一个name字段。用户可以在搜索框中输入书名或者作者名字来查找书籍。
  1. date_hierarchy属性(如前面提到的按月等)
class BookAdmin(admin.ModelAdmin):
    date_hierarchy = 'publication_date'
    • 定义:它是一个字符串,指定一个日期或日期时间字段,用于在管理界面的模型列表视图中创建日期层次导航。
    • 示例:如果Book模型有一个publication_date字段。
    • 这将在管理界面中为书籍列表创建一个日期层次导航,方便用户按年、月等浏览书籍。
  1. ordering属性
class BookAdmin(admin.ModelAdmin):
    ordering = ('-publication_date', 'title')
    • 定义:它是一个元组或列表,用于指定模型列表视图中的默认排序顺序。
    • 示例
    • 书籍列表将首先按出版日期降序排列(最新的在前面),如果出版日期相同,则按书名升序排列。
  1. fields属性
class BookAdmin(admin.ModelAdmin):
    fields = ('title', 'author', 'publication_date')
    • 定义:它是一个元组或列表,用于在管理界面的模型编辑视图中指定要显示的字段以及它们的顺序。
    • 示例
    • 在编辑书籍的页面,将只显示标题、作者和出版日期这三个字段,并且按照这个顺序排列。
  1. exclude属性
class BookAdmin(admin.ModelAdmin):
    exclude = ('created_at',)
    • 定义:它是一个元组或列表,与fields属性相反,用于在管理界面的模型编辑视图中指定不显示的字段。
    • 示例
    • 假设Book模型有一个created_at字段,在编辑书籍页面将不会显示这个字段。
  1. readonly_fields属性
class BookAdmin(admin.ModelAdmin):
    readonly_fields = ('publication_date',)
    • 定义:它是一个元组或列表,用于在管理界面的模型编辑视图中指定只读字段。
    • 示例
    • 如果不想让用户修改书籍的出版日期,就可以将这个字段设置为只读。
  1. inlines属性
  • 定义:它是一个列表,用于在管理界面的主模型编辑视图中嵌入相关联的子模型编辑表单。
  • 示例:假设Book模型有一个关联的Chapter模型,一个Book包含多个Chapter
from django.contrib import admin
from.models import Book, Chapter

class ChapterInline(admin.TabularInline):
    model = Chapter

class BookAdmin(admin.ModelAdmin):
    inlines = [ChapterInline]
  • 在编辑书籍的页面,会同时出现章节的编辑表单,方便同时管理书籍和它的章节。

app/models.py

# from django.db import models

# Create your models here.
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200 , verbose_name="标题" )
    author = models.CharField(max_length=100, verbose_name="作者", default="匿名") # 添加作者字段
    other = models.CharField(max_length=100, verbose_name="另外", default="other") # 添加作者字段
    content = models.TextField()
    # f_name = models.CharField("客户姓名", max_length=30)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    publish_date = models.DateField(null=True)
    icon = models.FileField(upload_to='blog\static\img', null=True)
    # icon2 = models.ImageField(upload_to='media/', null=True)
    icon2 = models.ImageField(default='bank.png', blank=True)

class pru(models.Model):
    title = models.CharField(max_length=200 , verbose_name="标题", default="标题")
    p_name = models.CharField(max_length=200 , verbose_name="名字")
    P_jg = models.CharField(max_length=100, verbose_name="价格", default="20") # 添加作者字段
    p_sl = models.CharField(max_length=100, verbose_name="数量", default="1") # 添加作者字段
    content = models.TextField()    

    def __str__(self):
        return self.title
    
class Netsite(models.Model):
    title = models.CharField(max_length=200 , verbose_name="标题", default="标题")
    content = models.TextField( verbose_name="内容", default="http://")

 

 

  1. 字段类型属性
    • CharField
      • 定义:用于存储较短的字符串,如姓名、标题等。
      • 参数
        • max_length:必需参数,定义字符串的最大长度。例如,name = CharField(max_length = 50)表示name字段最多可以存储50个字符。
    • TextField
      • 定义:用于存储大量的文本内容,如文章内容、评论等。没有长度限制,但在数据库层面可能会受到存储容量的限制。
    • IntegerField
      • 定义:用于存储整数,如年龄、数量等。可以设置nullblank属性来控制是否允许为空值。
    • PositiveIntegerField
      • 定义:只允许存储正整数(包括0),适用于存储计数、等级等不能为负的数值。
    • FloatField
      • 定义:用于存储浮点数,如价格、比率等。
    • DecimalField
      • 定义:用于存储十进制数字,尤其适用于需要精确计算的金融数据等。参数包括max_digits(数字的最大位数)和decimal_places(小数位数)。例如,price = DecimalField(max_digits = 10, decimal_places = 2)可以存储最多10位数字,其中小数部分为2位的价格数据。
    • DateField
      • 定义:用于存储日期,如出生日期、发布日期等。可以设置auto_now(每次保存对象时自动更新为当前日期)或auto_now_add(对象首次创建时自动设置为当前日期)等属性。
    • DateTimeField
      • 定义:存储日期和时间,功能与DateField类似,但包含时间信息。
    • TimeField
      • 定义:用于存储时间,如营业时间、活动时间等。
    • BooleanField
      • 定义:存储布尔值(TrueFalse),用于表示状态,如是否激活、是否完成等。
    • ForeignKey
      • 定义:用于建立一对多的关联关系。例如,一个Author模型和Book模型之间,Book模型中的author = ForeignKey(Author, on_delete = models.CASCADE)表示一本书有一个作者,on_delete参数定义了当关联的Author对象被删除时的行为,CASCADE表示级联删除,即删除作者时也删除其相关的书籍。
    • ManyToManyField
      • 定义:用于建立多对多的关联关系。比如,一个Student模型和Course模型之间,Student模型中的courses = ManyToManyField(Course)表示一个学生可以选择多门课程,一门课程也可以有多个学生选择。
    • OneToOneField
      • 定义:用于建立一对一的关联关系。例如,一个UserProfile模型和User模型之间可以通过UserProfile模型中的user = OneToOneField(User, on_delete = models.CASCADE)来表示一个用户配置文件对应一个用户。
  1. 字段选项属性
    • null
      • 定义:如果设置为True,表示该字段可以在数据库中存储NULL值。对于字符型字段,通常结合blank属性一起使用。
    • blank
      • 定义:如果设置为True,表示该字段在表单验证时可以为空。它主要用于控制用户输入,与数据库层面的null属性有所区别。例如,name = CharField(max_length = 50, blank = True)表示在表单中name字段可以不填,但在数据库中如果null = False,则会存储一个空字符串。
    • default
      • 定义:用于设置字段的默认值。例如,status = BooleanField(default = False)表示status字段的默认值为False
    • unique
      • 定义:如果设置为True,表示该字段在整个表中必须是唯一的。例如,email = CharField(max_length = 100, unique = True)确保每个用户的电子邮件地址是唯一的。
    • primary_key
      • 定义:如果设置为True,该字段将成为模型的主键。默认情况下,Django会自动为每个模型创建一个名为id的自增主键(AutoField),但如果需要自定义主键,可以使用primary_key属性。例如,user_id = CharField(max_length = 20, primary_key = True)可以将user_id字段设置为主键。
  1. 模型元数据属性(Meta类)
    • verbose_nameverbose_name_plural
class Book(models.Model):
    # 字段定义
    class Meta:
        verbose_name = "书籍"
        verbose_name_plural = "书籍们"
      • 定义verbose_name用于设置模型的单数名称,verbose_name_plural用于设置模型的复数名称,这些名称会在Django管理界面等地方显示。例如:
    • ordering
      • 定义:用于指定模型对象的默认排序顺序。例如,ordering = ['-created_date']表示模型对象将按照created_date字段的降序排列。
    • unique_together
      • 定义:用于指定一组字段的组合必须是唯一的。例如,unique_together = (("field1", "field2"),)表示field1field2这两个字段的组合在整个表中必须是唯一的。

app/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.post_index, name='post_index'),
    path('', views.post_list, name='post_list'),
    path('post/<int:pk>/', views.post_detail, name='post_detail'),
]

app/views.py

# from django.shortcuts import render

# Create your views here.
from django.shortcuts import render
from .models import Post, pru , Netsite

def post_index(request):
    posts = Post.objects.all()
    Netsites = Netsite.objects.all()
    return render(request, 'app/index.html', {'posts': posts, 'Netsites': Netsites})

def post_list(request):
    posts = Post.objects.all()
    return render(request, 'app/post_list.html', {'posts': posts})

def pru_list(request):
    prus = pru.objects.all()
    return render(request, 'app/post_list.html', {'prus': prus})

def post_detail(request, pk):
    post = Post.objects.get(pk=pk)
    return render(request, 'app/post_detail.html', {'post': post})

myapp/settings.py

# Application definition

INSTALLED_APPS = [
    'simpleui', # 管理后台
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ALLOWED_HOSTS = ['*'] # 允许所有主机访问


# Internationalization
# https://docs.djangoproject.com/en/5.1/topics/i18n/

LANGUAGE_CODE = 'zh-hans'  # 中文,简体
TIME_ZONE = 'Asia/Shanghai'  # 中国标准时间

# LANGUAGE_CODE = 'en-us'

# TIME_ZONE = 'UTC'

USE_I18N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.1/howto/static-files/

STATIC_URL = 'static/'
STATIC_DIR = [os.path.join(BASE_DIR, 'static')]

MEDIA_URL = 'media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

# Default primary key field type
# https://docs.djangoproject.com/en/5.1/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

# 隐藏右侧SimpleUI广告链接和使用分析
SIMPLEUI_HOME_INFO = False 
SIMPLEUI_ANALYSIS = False 

myapp/urls.py

from django.contrib import admin
from django.urls import include, path
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
    path('admin/', admin.site.urls),
    path('app/', include('app.urls')),
    path('', include('app.urls')),
] 

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
  1. path()函数的属性
    • route
      • 定义:这是一个字符串,用于定义URL模式。它可以包含动态部分,例如<int:id>,其中int表示这个动态部分期望接收一个整数类型的值,id是变量名。例如,path('books/<int:book_id>/', views.book_detail)中的books/<int:book_id>/就是route。它定义了一个以books/开头,后跟一个整数(作为book_id)的URL模式,用于访问特定书籍的详细信息。
    • view
      • 定义:这是一个视图函数或者基于类的视图。当URL匹配route所定义的模式时,Django会调用这个视图来处理请求。在上面的例子中,views.book_detail就是view,它是一个在views.py文件中定义的函数或者类,用于处理对特定书籍详细信息的请求。
    • kwargs
      • 定义:这是一个可选的字典参数,用于向视图函数或者基于类的视图传递额外的关键字参数。例如,path('books/<int:book_id>/', views.book_detail, kwargs={'extra_info': 'This is a book detail page'}),在视图book_detail中就可以通过extra_info这个参数来获取传递进来的This is a book detail page这个值。
    • name
      • 定义:这是一个可选的字符串,用于给URL模式命名。命名后的URL可以在Django项目的其他地方(如模板中的{% url %}标签)方便地引用。例如,path('books/<int:book_id>/', views.book_detail, name='book_detail_view'),在模板中就可以使用{% url 'book_detail_view' book_id=1 %}来生成指向book_id为1的书籍详细信息页面的链接。
  1. re_path()函数的属性(用于复杂的正则表达式匹配的URL)
    • regex
      • 定义:这是一个正则表达式字符串,用于定义复杂的URL模式。例如,re_path(r'^books/(?P<book_id>[0 - 9]+)/$', views.book_detail),这里的r'^books/(?P<book_id>[0 - 9]+)/$'就是regex。它使用正则表达式来匹配以books/开头,后跟一个或多个数字(作为book_id),并以/结尾的URL模式。
    • viewkwargs以及name属性与path()函数类似
  1. include()函数的属性(用于包含其他URL配置)
    • module
      • 定义:这是一个字符串或者模块对象,用于指定要包含的其他URL配置模块。例如,include('app_name.urls'),其中app_name.urls就是module,它告诉Django去包含app_name应用下的urls.py文件中的URL配置。
    • namespace
      • 定义:这是一个可选的字符串,用于给包含的URL配置命名空间。命名空间在有多个应用或者多个URL配置可能产生命名冲突时非常有用。例如,include('app_name.urls', namespace='app_namespace'),这样在引用这个应用中的URL时,就可以使用app_namespace:view_name的格式来明确是哪个应用下的视图。

 

4. 关于设置中文显示参考

app/models.py

# 订单表
class Order(models.Model):
    id = models.AutoField(primary_key=True)
    customer_name = models.CharField(max_length=255 ,verbose_name = "订单")
    customer_phone = models.CharField(max_length=20)
    payment_method = models.CharField(max_length=50)
    payment_status = models.BooleanField(default=False)
    date = models.DateField()
    operator = models.CharField(max_length=100)
    verbose_name = "订单"
    class Meta:
        verbose_name = '订单表'
        verbose_name_plural = verbose_name

# 订单详情表
class OrderDetail(models.Model):
    serial_number = models.AutoField(primary_key=True)
    order_id = models.ForeignKey(Order, on_delete=models.CASCADE)
    product = models.CharField(max_length=255)
    quantity = models.IntegerField()
    class Meta:
        verbose_name = '订单详情表'
        verbose_name_plural = verbose_name

 app/app.py

from django.apps import AppConfig


class BlogConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'blog'
    verbose_name = '博客'

myapp/settings.py

LANGUAGE_CODE = 'zh-hans'  # 中文,简体
TIME_ZONE = 'Asia/Shanghai'  # 中国标准时间

ALLOWED_HOSTS = ['*'] # 允许所有主机访问

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐