我在django后台,页面新增或者修改记录时,会输入数据到指定的model里,当前系统有2个用户角色。现在我只需要显示系统角色为教师的用户,重写 admin下的 render_change_form()方法,改写获取本Model下的外键逻辑。
model 里定义了两个角色, 分别是家长和老师,用role字段表示,如下:
class SysUser(TimestampModel):
name = models.CharField(verbose_name='用户昵称', max_length=Constant.db_name_length, null=True, blank=True)
mail = models.CharField(verbose_name='邮箱', max_length=Constant.db_name_length, null=True, blank=True)
gender = models.IntegerField(verbose_name='性别', choices=GENDER_TYPE, null=True, blank=True)
age = models.IntegerField(verbose_name='年龄', null=True, blank=True)
role = models.IntegerField(verbose_name="角色", choices=USER_ROLE, default=-1)
last_name = models.CharField(verbose_name="姓名", max_length=Constant.db_name_length, null=True, blank=True)
birthday = models.CharField(verbose_name="生日", max_length=Constant.db_name_length, null=True, blank=True)
class Meta:
verbose_name = '系统用户信息'
verbose_name_plural = '系统用户信息'
db_table = "sys_user"
def __str__(self):
return str(self.id) + "-" + self.name
然后我在后台通过外键查询,会获取到默认的所有用户,即包含了家长,又包含了教师,如下:

定义的孩子的家长映射关系:
class ParentChild(TimestampModel):
parent = models.ForeignKey(SysUser, verbose_name="家长", to_field="id", related_name="parent_child_parent_id",
on_delete=models.DO_NOTHING)
relation = models.IntegerField(verbose_name="关系", choices=PARENT_CHILD_RELATION, default=0)
child = models.ForeignKey(Student, verbose_name="孩子", to_field="id", related_name="parent_child_id",
on_delete=models.DO_NOTHING)
class Meta:
verbose_name = '家长孩子映射'
verbose_name_plural = '家长孩子映射'
db_table = "parent_child_mapping"
接下来我们可以通过重写 render_change_form()方法,将 ParentChild的外键 parent 的获取逻辑改写,添加筛选条件,即可满足当前需求!
class ParentChildAdmin(CommonAdmin):
verbose_name = "家长孩子"
list_display = ('parent', 'relation', 'child',)
def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
if not request.user.is_superuser:
p = SysUser.objects.filter(role=0)
context['adminform'].form.fields['parent'].queryset = p
return super(ParentChildAdmin, self).render_change_form(request, context, add, change, form_url, obj)
ParentChildAdmin(model=ParentChild, admin_site=admin.site)
我在django后台,页面新增或者修改记录时,会输入数据到指定的model里,当前系统有2个用户角色。现在我只需要显示系统角色为教师的用户,重写 admin下的 render_change_form()方法,改写获取本Model下的外键逻辑。model:class SysUser(TimestampModel): name = models.CharField(verbose_name='用户昵称', max_length=Constant.db_name_length, null=Tru
class OrderAdmin(admin.ModelAdmin):
list_display = (
'_nick_name', 'time_order', 'year', 'item', 'status', 'number',
'money', 'deduction_point', 'deduction_account', 'pay',
'_open_id', 'out_trade_no', )
search_fields = [
'user__nick_name', 'user__wechatuser__open_id',
创建应用 python manage.py startapp stu
配置数据库(如果不加配置,则默认为django自带的数据库,db.sqlite3,这不影响后面操作)
from django.db import models
# Create your models here.
class Clazz(models.Model):
cname=mo...
1.django从2.0开始ForeignKey中的on_delete参数是必须的。
on_delete=None, # 删除关联表中的数据时,当前表与其关联的field的行为
on_delete=models.CASCADE, # 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING, # 删除关联数据,什么也不做
on_delete=models.PROTECT, # 删除关联数据,引发错误ProtectedError
django 1.8.4
错误内容:related Field has invalid lookup: icontains
我原来默认认为在处理外键搜索的时候,django会自动将该外键的行数据以str()化之后进行搜索,但其实并不是这样的,如果将外键加入到搜索域中,需要明确写出来。
这个是我从网上查到的解决方案,测试可用,如下:
models.py
Django 2.1.7 Admin管理
后台文章
Django 2.1.7 Admin管理
后台 - 注册模型、自定义显示列表字段
Django 2.1.7 Admin - 列表页选项
Django 2.1.7 Admin - 编辑页选项
https://docs.
djangoproject.com/zh-hans/2.1/intro/tutorial07/
在写项目的过程中我们不可避免的会使用到外键这个东西,那么Django中是怎样来使用外键的呢?
了解外键
在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是InnoDB引擎,是支持外键约束的。外键的存在使得ORM框架在处理表关系的时候异常的强大。MySQL数据库默认使用的也是InnoDB引擎。
使用外键
新建一个项目,创建一个article的app,添加至sett...
➜ python
Python 3.6.3 |Anaconda custom (x86_64)| (default, Oct 6 2017, 12:04:38)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "cr
1.2 重写Django admin用户认证
1.3 将要显示的表注册到我们自己的kind_admin.py中
1.4 项目首页:显示注册的app名、表名(kind_admin_index.html 页面1)
1.5 展示表中各条数据(display_table_obj.html 页面2)
1.6 添加数...
今天在设置django的搜索框搜索条件时,外键的不能直接像字符串类型那样直接写search_field中,但是我又想让他通过外键关联的数据条件搜索,
参考http://www.voidcn.com/article/p-gsdvpisv-bau.html
可以设置按照所关联的数据中某个字段搜索,比如我有两个表,一个收藏记录表(Collect),一个用户表(Userprofile),我想让人能够通...