当前位置:首页 > Django 实例小功能

Django 实例小功能

  • 最新
  • 浏览
  • 评论

Django 3 插件大全

安力量5个月前 (05-10)Django 实例小功能123

django-parler 内容翻译多站点等

安力量3个月前 (06-29)Django 实例小功能63

django 获取客户端 浏览器和系统类型

安力量3个月前 (06-27)Django 实例小功能74

使用:https://pypi.python.org/pypi/user-agents/  插件

安装需要安装两个插件:

pip install pyyaml ua-parser user-agents

Django 3 在线邮件发送示例 配合form

安力量4个月前 (05-28)Django 实例小功能122

配置文件可以用本地服务器也

导航分类知识无限制层级

安力量5个月前 (05-12)Django 实例小功能110

django-treebeard 笔记 树结构 无限级分类

安力量4个月前 (06-03)Django 实例小功能114
django-treebeard 笔记 树结构 无限级分类

1、安装简单介绍:

相邻列表(Adjacency List)树是简单结构,其中每个节点有一个parent属性。虽然读运算很快,但写的速度很慢。
嵌套集合(Nested Sets)树和MPTT树相同,它们将节点作为集合放到父级之一进行嵌套。这一结构还提供非常快速的读访问,代价是写和删除操作开销更大,尤其是在以指定排序写入的时候。
物化路径(最好 Materialized Path)树在树中的每个节点都有关联的路径属性,即一个表明从根到节点的完整路径,很像是访问网站中指定页面的URL路径。这是所支持的最有效的方式。

pip install django-treebeard
添加'treebeard'到 INSTALLED_APPS 设置文件中

模型文件:
# 引用这个模块
from treebeard.mp_tree import MP_Node

# 继承MP_Node类
class Category(MP_Node):
    name = models.CharField(max_length=30)
    #排序 方法 我使用的是 node_order_by = ['depth自动生成的字段','排序字段'] 或者使用path 加 排序字段也可以
    node_order_by = ['name']
    
    #返回名字
    def __str__(self):
        return self.name
        
后台如果想管里使用admin.py:
from treebeard.admin import TreeAdmin
from treebeard.forms import movenodeform_factory
# 这就可以了Category 要管你的模型名
@admin.register(Category)
class CategoryAdmin(TreeAdmin):
    # 这几个'path', 'depth','numchild' 不是必须加
    list_display = ('name','id', 'path', 'depth','numchild')
    # 还不知道干什么的
    form = movenodeform_factory(Category)

django 3 后台筛选过滤 外键和定义列表显示父分类下的所有子分类 多级分类实现楼梯外键样式

安力量4个月前 (06-05)Django 实例小功能91
admin.py
# 筛选后台功能 筛选为列表的数据 不用了
class DecadeBornListFilter(admin.SimpleListFilter):
    title = "分类"
    parameter_name = 'scode__id__exact'

    def lookups(self, request, model_admin):
        return Content_sort.objects.filter(mcode=1).values_list('id', 'name', 'depth')

    def queryset(self, request, queryset):
            # self.value()这个是上面传递过来的值
            aa = self.value()
            # aa为空返回全部列表
            if aa:
                category = get_object_or_404(Content_sort, id=aa)
                categorynames = list(map(lambda c: c.filename, category.get_sub_categorys()))
                wenzhangliebiao = Content.objects.filter(scode__filename__in=categorynames)
                return wenzhangliebiao
            return queryset    


@admin.register(Content)
class ContentAdmin(admin.ModelAdmin):
       .......
    list_filter = ['status', DecadeBornListFilter]

django simpleui 后台主题笔记

安力量4个月前 (06-02)Django 实例小功能121

自定义菜单

#system_keep 保留系统菜单

该字段用于告诉simpleui,是否需要保留系统默认的菜单,默认为False,不保留。 如果改为True,自定义和系统菜单将会并存

django 3 管理后台列表显示缩略图和编辑页看缩略图

安力量4个月前 (05-31)Django 实例小功能117

1、后台列表显示模型文件:

class Content(models.Model):
    """ 文章内容 """
    scode = models.ForeignKey('Content_sort', verbose_name='文章类型', on_delete=models.CASCADE)
    subscode = models.CharField(verbose_name='内容副栏目', max_length=30, blank=True, null=True)
    title = models.CharField(verbose_name='标题', max_length=30)
    titlecolor = models.CharField(verbose_name='标题颜色', max_length=30, blank=True, null=True)
    subtitle = models.CharField(verbose_name='副标题', max_length=30, blank=True, null=True)
   
    ico = models.ImageField(upload_to='upload/%Y%m%d', storage=ImageStorage(),
                            verbose_name='产品大图缩略图')
    pics = models.ImageField(upload_to='upload/%Y%m%d', storage=ImageStorage(), blank=True, null=True,
                            verbose_name='栏目缩略图1')
    
   
    class Meta:
        ordering = ['sorting']
        verbose_name = '文章内容'
        verbose_name_plural = '文章内容'

    def __str__(self):
        return self.title

        ## 列表页显示图片
    def image_img(self):
        if not self.ico:
            return '无'
        from django.utils.html import format_html
        return format_html(
            """<div><img src='{}' style='width:50px;height:50px;' ></div>""",
            self.ico.url)

    image_img.short_description = '产品大图缩略图'

模型中读取本地模板文件 import os

安力量4个月前 (05-29)Django 实例小功能110
import os

moban_liebiao = os.listdir(path='dfweb/templates/dfweb/pc')
mobanliebiao = tuple(zip(moban_liebiao, moban_liebiao))

然后模型中可以用 
listtpl = models.CharField(verbose_name='分类列表模板', choices=mobanliebiao, max_length=40)
contenttpl = models.CharField(verbose_name='内容模板', choices=mobanliebiao, max_length=30)

更好的实现方法:
listtpl = models.FilePathField(verbose_name='分类列表模板', path="dfweb/templates/dfweb/pc/")
contenttpl = models.FilePathField(verbose_name='内容模板', path="dfweb/templates/dfweb/pc/")

注意:视图中切片可以获取想要的最终名字

django 3 根据相似性检索帖子 相关文章功能

安力量4个月前 (05-29)Django 实例小功能107

使用这个功能的前提是需要已经有了标签功能django_taggit

视图函数:

from django.db.models import Count

def post_detail(request, year, month, day, post):
    post = get_object_or_404(Post, slug=post,
                                   status='published',
                                   publish__year=year,
                                   publish__month=month,
                                   publish__day=day)

    # List of active comments for this post
    comments = post.comments.filter(active=True)

    new_comment = None

    if request.method == 'POST':
        # A comment was posted
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():
            # Create Comment object but don't save to database yet
            new_comment = comment_form.save(commit=False)
            # Assign the current post to the comment
            new_comment.post = post
            # Save the comment to the database
            new_comment.save()
    else:
        comment_form = CommentForm()

    # 在这个位置开始 
    #values_list方法,数据以列表返回,列表元素以元组表示例如 <QuerySet [('软件工程师',),('文员',),('网站设计')]> flat=True转换成列表格式例如:[1,2,3.4,3]
    # 返回所有post是接收的url名字hao-lou 这一行的tags字段中的id列表例如:[1,2,3.4,8]
    # 查询自己的tags字段中的id 有哪些
    post_tags_ids = post.tags.values_list('id', flat=True)
    # 查询Post表所有published自定义的查询没区别,判断上面查出的post_tags_ids列表中是否有当前tags字段中的id,exclude排除当前id=post.id 是post表中的id
    # 结果是:列出所有和本文章使用标签使用相同标签的文章列表
    # 查询所有和自己有关的标签列表
    similar_posts = Post.published.filter(tags__in=post_tags_ids).exclude(id=post.id)
    # similar_posts相关文章列表 same_tags=Count('tags') 生成一个新的字段same_tags,按照这个字段排序,显示4条数
    similar_posts = similar_posts.annotate(same_tags=Count('tags')).order_by('-same_tags','-publish')[:4]                               
    # 在这个位置结束
    
    return render(request,
                  'blog/post/detail.html',
                  {'post': post,
                   'comments': comments,
                   'new_comment': new_comment,
                   'comment_form': comment_form,
                   'similar_posts': similar_posts})#similar_posts上下文模板中用

django 3 富文本编辑器使用 django-ckeditor

安力量5个月前 (05-09)Django 实例小功能113

django后台使用教程

pip install django-ckeditor  安装最新版

配置文件:

INSTALLED_APPS = [
    'ckeditor',
    'ckeditor_uploader',
]

#上传文件文件夹
CKEDITOR_UPLOAD_PATH = "article_images"

#是否允许上传文件显示在浏览器上
CKEDITOR_BROWSE_SHOW_DIRS = True

# 是否限制只能上传图片文件
CKEDITOR_ALLOW_NONIMAGE_FILES = False

# 富文本编辑器ckeditor配置
CKEDITOR_CONFIGS = {
    'default': {
        # 编辑器宽度自适应
        'width': 'auto',
        'height': '600px',
        # tab键转换空格数
        'tabSpaces': 4,
        # 工具栏风格
        'toolbar': (
            ['div', 'Source', '-', 'Save', 'NewPage', 'Preview', '-', 'Templates'],
            ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Print', 'SpellChecker', 'Scayt'],
            ['Undo', 'Redo', '-', 'Find', 'Replace', '-', 'SelectAll', 'RemoveFormat'],
            ['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', 'HiddenField'],
            ['Bold', 'Italic', 'Underline', 'Strike', '-', 'Subscript', 'Superscript'],
            ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', 'Blockquote'],
            ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'],
            ['Link', 'Unlink', 'Anchor'],
            ['Image', 'Flash', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak'],
            ['Styles', 'Format', 'Font', 'FontSize'],
            ['TextColor', 'BGColor'],
            ['Maximize', 'ShowBlocks', '-', 'About', 'pbckcode'],
            ['Blockquote', 'CodeSnippet'],
        ),
        # 添加按钮在这里
        'toolbar_Custom': [
            ['NumberedList', 'BulletedList'],
            ['Blockquote', 'CodeSnippet'],
        ],
        # 插件
        'extraPlugins': ','.join(['codesnippet', 'widget', 'lineutils', ]),
    },
}


#修改根路由编辑器
re_path('media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}, name='media'),
re_path('static/(?P<path>.*)', serve, {'document_root': settings.STATIC_ROOT}, name='static'),
# 设置编辑器的路由信息
path('ckeditor/', include('ckeditor_uploader.urls')),


    
修改模型类文件models.py:
from ckeditor_uploader.fields import RichTextUploadingField
  # 之前为 content = models.TextField(verbose_name='内容')替换成:
    content = RichTextUploadingField(verbose_name='内容')

迁移数据:
python manage.py makemigrations
python manage.py migrate

Django 3 文章评论功能 使用 ModelForm

安力量4个月前 (05-28)Django 实例小功能114

1、定义一个放评论的模型类

class Comment(models.Model):
    #概念:管理文章详情模型,每个文章成为评论的父类 related_name='comments'在文章页面反向查询文章的评论comments.post 含义: 表名.字段名
    # 字段名post.comments是related_name的值,使用post.comments.all()来查询某个文章所有评论,如果没有定义related_name='comments'将使用_set 小写表名comment_set关联评论
    post = models.ForeignKey(Post,on_delete=models.CASCADE,related_name='comments')
    name = models.CharField(max_length=80)
    email = models.EmailField()
    body = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    active = models.BooleanField(default=True)

    class Meta:
        ordering = ('created',)

    def __str__(self):
        return f'Comment by {self.name} on {self.post}'

Django 3 标签功能 django_taggit

安力量4个月前 (05-28)Django 实例小功能114

1、安装django_taggit第三方插件

pip install django_taggit==1.2.0

2、加入配置文件app

INSTALLED_APPS = [
      ...
    'taggit',
]