CRM系统项目总结

一、准备:

  1、组件部分(数据增删改查实现):模仿django admin开发一个组件

    效果:

    (1)、启动服务(先在settings中添加app)

from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modules


class XadminConfig(AppConfig):
    name = 'xadmin'

    def ready(self):
        autodiscover_modules('xadmin')
AppConfig

    (2)、注册表

from django.db import models

# Create your models here.
class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)
    age=models.IntegerField()

    # 与AuthorDetail建立一对一的关系
    authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)
    def __str__(self):
        return self.name

class AuthorDetail(models.Model):

    nid = models.AutoField(primary_key=True)
    birthday=models.DateTimeField()
    telephone=models.BigIntegerField()
    addr=models.CharField( max_length=64)

    def __str__(self):
        return self.addr

class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)
    city=models.CharField( max_length=32)
    email=models.EmailField()



    def __str__(self):
        return self.name


class Book(models.Model):

    nid = models.AutoField(primary_key=True, verbose_name=" 编号")
    title = models.CharField( max_length=32, verbose_name="书籍名称")
    publishDate=models.DateTimeField(null=True, verbose_name='日期')
    price=models.DecimalField(max_digits=5, decimal_places=2)

    # 与Publish建立一对多的关系,外键字段建立在多的一方
    publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE)
    # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
    authors=models.ManyToManyField(to='Author',)


    def __str__(self):
        return self.title
models
from xadmin.service.start__xadim import site, ModelAdmin
from app01 import models
from django import forms
from django.utils.safestring import mark_safe
from django.urls import reverse


class BookConfig(ModelAdmin):

    # def add_tag_change(self, obj=None, is_header=False):
    #     if is_header:  # 如果是表头
    #         return '修改操作'
    #     return mark_safe('<a href="%s">修改</a>' % reverse('change_data', args=(obj.pk,)))  # 如果是表单数据
    #
    # def add_tag_delete(self, obj=None, is_header=False):
    #     if is_header:
    #         return '删除操作'
    #     return mark_safe('<a href="%s/delete">删除</a>' % reverse('delete_data', args=(obj.pk,)))
    #
    # def add_tag_checked(self, obj=None, is_header=False):
    #     if is_header:
    #         return mark_safe('<input type="checkbox" name="checked_data" class="all">')
    #     return mark_safe('<input type="checkbox" name="checked_data" value="%s" class="list_all">' % obj.pk)
    class ModelForms(forms.ModelForm):
        class Meta:
            model = models.Book
            fields = '__all__'
            widgets = {'publishDate': forms.widgets.TextInput(attrs={'type': 'date', }), }
            labels = {
                'title': '书名',
                'price': '价格',
            }

    # def action_test(self, queryset, request):
    #     print(self,type(self))
    #     for i in queryset:
    #         i.price = 100
    #         i.save()

    # action_test.short_description = "批量初始化"  # action函数功能实现简介

    list_display = ['nid', 'title', 'price', 'publish', 'publishDate', 'authors']
    list_display_links = ['title']
    model_forms_chinese_field = ModelForms
    list_search_fields = ['title', 'price']
    # list_action_func = [action_test]
    list_filter = ['title', 'publish', 'authors']

class PublishConfig(ModelAdmin):
    list_display = ['nid', 'title', 'price']


site.register(models.Book, BookConfig)
site.register(models.Publish)
site.register(models.Author)
site.register(models.AuthorDetail)
在组件之外的app中添加表和注册表

    (3)、服务(url分发,数据增删改查,展示等等)

       注意问题:

        url二级分发为什么在配置类实现?

        url地址反向解析

        自定义显示哪些字段内容,多对多字段该如何处理,修改和删除标签、哪个字段可点击进入到修改页面,该如何实现

扫描二维码关注公众号,回复: 9739098 查看本文章

        自定义哪些字段可以搜索,获取搜索值后用Q方法处理条件

        自定义批量处理函数,页面标签value值应该放什么(函数名,选中数据的pk值)

        自定义哪些字段可以筛选(关系字段如何获取,普通字段如何获取)

field_obj = self.model_admin_self.model._meta.get_field(filter_field)
            if isinstance(field_obj, ManyToManyField) or isinstance(field_obj, ForeignKey):  # 过滤标签是不是多对多或者多对一关系
                queryset_list = field_obj.remote_field.model.objects.all()  # 是的话取到所有关联表对象
通过字符串形式的字段取得对应关系表的所有对象

        修改页面时,关系字段应该可以直接点击添加按钮添加关系字段对象

        主页面展示的数据应该放在一个类下,比如分页数据、表头数据、表单数据、函数数据、过滤字段数据等。只需要在视图函数中创建这个类对象,把所有数据对象、request、当前models的配置类self对象作为参数传入,把创建的这个类对象传入模板语言,模板语言直接通过这个对象可以调用类下的所有方法,用于展示分页、表头、表单等数据。

        修改和增加页面使用modelform模块快速构建一个html页面

        url路径保存搜索条件:先深copy之前的url条件,然后再往条件添加新的条件,添加后换成url编码,最后把它拼到a标签        

params = copy.deepcopy(request.GET) # {‘publish’:‘1’}
params[id] = 1  #{‘publish’:‘1’, ‘id’:‘1’}
url = params.urlencode()  #publish=1&id=1
link_tag = mark_safe("<a href='?%s' class='filter_field'>%s</a>" % (url, text))     

    (4)、url

from django.contrib import admin
from xadmin.service.start__xadim import site
from django.urls import path, re_path

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

    

  2、权限管理部分:RBAC权限介绍,用django制作一个简单的权限组件

二、导入组件:

三、功能扩展:

猜你喜欢

转载自www.cnblogs.com/aizhinong/p/12459652.html