Django学习8 -- 添加个人应用(自定义应用页面--持续补充)
Django的优势不言而喻,学习优化持续进行。以用为主,不求甚解,解决现实问题,记下以备复习。
1. models.py
1) 默认值/帮助tip:default / help_text: help_text='Help Text',default='Default Text'
2) 字段别名:verbos_name,页面别名显示
checkuser = models.CharField(verbose_name='Verbos Name',help_text='Help Text',default='Default Text')
3) show current date:date.today / timezone.now
2. admin.py
1) get_queryset: 列表只显示当前用户数据(only show current user data)
# 过滤列表显示内容 querset
class DailyrecordAdmin(admin.ModelAdmin):
def get_queryset(self,request):
qs = super(DailyrecordAdmin, self).get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(user_id=request.user)
2) 折叠fieldss:t:'classes': ('collapse',)
fieldsets = ('classes': ('collapse',),
('Basic', {'classes': ('collapse',),
'fields': (('drecorddate','user','dmanhour','overtime',),
('project','task',),)}),)
3) 只读字段显示 : readonly_fields = ('dmanhour','drecorddate') , (list)/ [tuple]
def get_readonly_fields(self, request, obj=None):
### readonly fields as select obj or not
if obj: # select object and edid
self.readonly_fields = ["fields1","fields2",]
else: # not select, means ne2
self.readonly_fields = ["pe_user",]
return self.readonly_fields
### readonly fileds as user role
if request.user.is_superuser:
self.readonly_fields = [] # 管理员,所有字段非只读(read only)
# change_view页面显只读字段内容,add_view页面显示为 -
return self.readonly_fields # show as readonly_fields setting
4) 列表action操作:actions_on_top = True / False
5) 列表查询:search_fields = ('列1','列2','列3')
6) 每页显示条目数: list_per_page = number
7) 列排序:ordering = ('列1','列2','列3')
8) 列数据筛选:
list_filter = ('列1','列2','列3') -- 页面列表右侧显示
date_hierrchy = ’日期列‘ -- 页面列表上方显示
9) 数据保存:save_on_top = True / False -- 记录添加页面顶部显示 Save 按钮
10) 列表字段可编辑:list_editable = ('列1','列2','列3')
列表字段显示超链接:list_display_links = ('列1','列2','列3') -- 默认列表第一列,链接到详细记录页面
-- 可编辑 和 超链接字段需联合使用,并且超链接字段中存在与可编辑字段不同的字段
11) inline -- 通过主外键关系建立两条数相关数据管理页面
同时也可以建立一张主键表,多张外键表,形成1对N的主、副属性关系
## models.py
class Task(models.Model):
taskname = models.CharField("Task Name",max_length=150, unique=True)
......
class TaskDetail(models.Model):
## 通过外键指向主表 task, 引用字段 taskname
task = models.ForeignKey(Task, to_field='taskname', max_length=150, on_delete=models.CASCADE)
taskdetail = models.CharField(max_length=150)
......
## admin.py
## 定义子表 inline 引用
class TaskDetailinline(admin.TabularInline):
model = TaskDetail
extra = 0
class TaskAdmin(admin.ModelAdmin):
......
## 主表引用
inlines = [TaskDetailinline]
12) formfield_for_foreignkey
# 定义外键字段显示
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "field_name":
kwargs["queryset"] = Foreign_Model.objects.filter(foreign_field_name=request.user) # 此处过滤使用:外键的模块 和 外键引用字段
return super().formfield_for_foreignkey(db_field, request, **kwargs)
13)formfield_for_choice_field()
# 重写 choice 字段内容
def formfield_for_choice_field(self, db_field, request, **kwargs):
if db_field.name == "choice_field_name":
kwargs['choices'] = () # 初始化 choice 属性
if request.user.is_superuser and db_field.name == "choice_field_name":
kwargs['choices'] += (('New', 'This is new choice'),) # 新增 choice 属性
return super().formfield_for_choice_field(db_field, request, **kwargs)
14)formfield_overrides
# 重写表单字段
formfield_overrides = {
models.TextField: {
'widget': Textarea(attrs={'cols': 60, 'rows': 1})} # 此处将model中定义的text field字段默格式 40*10 重定义为 60*1
}
3. Django admin页面
1) 登录页面图片显示
--> create folder static and copy PIC
--> modifiy: Lib\site-packages\django\contrib\admin\templates\admin\base_site.html
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static"), '/../static/',]
<h1 id="site-name"><img src="{%static "/work2.jpg" %}" alt="Logo" width=25% hspace=0><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>
2) view 与 page参数传递:
* view通过 GET/POST方法从page获得数据
* page通过view的render方法,使用{% %} 和 {{ }}使用view中数据
3) 数据的级联选择 django-smart-selects
4)view文件中处理数据:*.objects.raw(SQLstr),生成RawQuerySet,然后进行后期数据处理
“not enough arguments for format string” -- 注意sql是否可以正确在执行且返回值,特别是模糊查询时使用“%%”替代“%”
4. 自定义页面权限设置
# set self-define authentication in view, using admin default administration
from django.contrib.admin.views.decorators import staff_member_required
def new_page(request): #self define page
# page data check
# transfer data to front-page
return render(request, 'new_page.html', {page data})
new_page = staff_member_required(new_page ) # set new_page accessing authentication
相关文章
- Django中allauth的安装与基本使用
- 创建一个Django项目
- Django(75)django-rest-framework-simplejwt「建议收藏」
- Django 分析(一)Requst、Middleware 和 Response 数据流
- django实现分页_vue json
- Django应用上线前有哪些注意事项?如何使用同步或异步容器启动Django应用?
- Django+Celery学习笔记3——django+celery+redis实现异步任务与定时任务
- Django+Celery学习笔记4——django+celery+redis周期任务Crontabs设置
- Django Web接口开发
- Add a button/form/link to Django Admin(添加按钮、表单、链接到 django admin)
- 用Python Django建一个issue跟踪管理网站(一)Django的安装和使用
- django import_export 个性化导出 model 里的 字段含有 choice 的值
- python-Django-Django 常用模板标签和过滤器(二)
- Django REST Framework-过滤器(三)
- Django REST Framework-常用的信号类型(一)
- Django自定义中间件及其实例应用
- Django信号机制执行过程及其应用
- Python3:Django连接Mysql数据库时出错,’Did you install mysqlclient or MySQL-python’详解编程语言
- django 重写update,create,delete方法详解编程语言
- Django创建应用三详解编程语言
- Django的models操作详解编程语言
- Django的admin介绍详解编程语言