精华内容
下载资源
问答
  • 主要介绍了django实现模型字段动态choice的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 需求是根据当前登录用户来显示不同的选项。...让每次实例化PushRuleForm时,test_mode字段的choices根据用户重新赋值 class PushRuleForm(forms.ModelForm): def __init__(self, *args, **kwargs): ...

    需求是根据当前登录用户来显示某个choice字段不同的选择项。

    先放现在的实现版本。

    1、重写PushRuleForm的__init__方法,

    让每次实例化PushRuleForm时,test_mode字段的choices根据用户重新赋值

    class PushRuleForm(forms.ModelForm):   
        def __init__(self, *args, **kwargs):
            if self.request.user.username in Const.TEST_USER_LIST:
                # 如果进入都是add添加新项的页面
                if not kwargs.get('instance'):
                    # self.fields['test_mode'].initial = 1
                    self.fields['test_mode'].choices = [(1,'Test')]
               # else:
               #     self.fields['test_mode'].choices = [choice for choice in [(0,'OnLine'),(1,'Test')] if self.instance.test_mode in choice]
    
    

    2、重写PushRuleAdmin的changeform_view方法,进入add和change页面都会调用changeform_view方法,都能让form获取request属性,所以重写这个方法比较好,PushRuleForm获取request属性后,form表单处理是就能通request.user.username取用户名

    class PushRuleAdmin:
        form = PushRuleForm
        def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
            self.form.request = request
            return super(PushRuleAdmin, self).changeform_view(request, object_id, extra_context=extra_context)
    
    

     mode.py对应的代码如下:

    class PushRule(models.Model):    
        test_mode   = models.IntegerField(verbose_name='TestMode', default=0, choices=[(0,'OnLine'),(1,'Test')])

    实现方式2:

    ,重写PushRuleAdmin的render_change_form方法,传入test_user_list上下文,通过js来判断当前用户是否是测试用户。

    class PushRuleAdmin:
        def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
            context['test_user_list']=Const.TEST_USER_LIST
            return super(PushRuleAdmin, self).render_change_form(request, context, add=False, change=False, form_url='', obj=None)

    js代码: 

        if (test_user_list.includes(username))
        {
            $("#id_test_mode > option[value='0']").remove();
        }

    html模板代码:
    为了让js获取django模板变量,先定义一个username和test_user_list变量

      <script> var username="{{ user.username }}", test_user_list="{{ test_user_list }}"</script>
    

    不过这么的坏处是用户列表信息直接暴露在前端代码里了,跟直接在js里维护一个测试用户列表一样的效果,遂放弃这种做法


    实现方式3:

    后端写一个视图接口,返回对应的test_user_list,js里写一个ajax请求,来请求这个视图获取test_user_list

    实测没有问题。


    实现方式4:

    类似方法2,只不过不通过js来处理,直接通过django模板来处理,主要是重写django/contrib/admin/templates/admin/includes/fieldset.html这个模板文件,对django模板语法不太熟,遂放弃。


    未实现的思路,想在PushRuleAdmin中直接修改model的test_mode字段的chioce选项,不过没实现,

    想修改model的fields,不过发现他是一个ImmutableList类型,修改会报错。

    不过stackoverflow上的给出的这个方法不错,可以参考,就是缺一个获取用户名的地方,哪天再看一下


    参考:

    https://stackoverflow.com/a/12005426/9917670

    https://hushuikun.com/django-model-dong-tai-xuan-xiang/ 

    展开全文
  • 当处理django模型修改的时候,使用syncdb命令无法达到目的,访问数据模型时会报这个错误。 Exception Value: no such column: books_book.num_pages 原因是使用syncdb这个命令仅仅是创建...

    当处理django模型修改的时候,使用syncdb命令无法达到目的,访问数据模型时会报这个错误。

    Exception Value:
    no such column: books_book.num_pages

    原因是使用syncdb这个命令仅仅是创建数据库里还没有的表,它并不对你数据模型的修改进行同步,也不处理数据模型的删除如果你新增或修改数据模型里的字段,或是删除了一个数据模型,你需要手动在数据库里进行相应的修改。

    查了官网的api,找到以下解决方法

    添加字段

    操作:

    1. 在你的模型里添加字段。

    2. 运行 manage.py sqlall [yourapp] 来测试模型新的 CREATE TABLE 语句。 注意为新字段的列定义。

    3. 开启你的数据库的交互命令界面(比如, psql mysql , 或者可以使用 manage.py dbshell )。 执行 ALTER TABLE 语句来添加新列。

    4. 使用Python的manage.py shell,通过导入模型和选中表单(例如, MyModel.objects.all()[:5] )来验证新的字段是否被正确的添加 ,如果一切顺利,所有的语句都不会报错。


    删除字段

    从Model中删除一个字段要比添加容易得多。 删除字段,仅仅只要以下几个步骤:

    1. 删除字段,然后重新启动你的web服务器。

    2. 用以下命令从数据库中删除字段:ALTER TABLE books_book DROP COLUMN num_pages;

    如果你先从数据库中删除字段,Django将会立即抛出异常。


    删除多对多关联字段

    由于多对多关联字段不同于普通字段,所以删除操作是不同的。

    从你的模型中删除ManyToManyField,然后重启web服务器。

    用下面的命令从数据库删除关联表:DROP TABLE books_book_authors;

    像上面一样,注意操作的顺序。


    删除模型

    删除整个模型要比删除一个字段容易。 删除一个模型只要以下几个步骤:

    1. 从文件中删除你想要删除的模型,然后重启web 服务器models.py

    2. 然后用以下命令从数据库中删除表:DROP TABLE books_book;

    当你需要从数据库中删除任何有依赖的表时要注意(也就是任何与表books_book有外键的表 ),删除对应的字段。


    附上models.py文件的代码(要尝试上面的步骤记得先同步数据模型python manage.py syncdb):

    # Create your models here.
    class Publisher(models.Model):
        name = models.CharField(max_length=30)
        address = models.CharField(max_length=50)
        city = models.CharField(max_length=60)
        state_province = models.CharField(max_length=30)
        country = models.CharField(max_length=50)
        website = models.URLField()
        def __unicode__(self):
            return self.name
        class Meta:
            ordering = ['name']
    
    class Author(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=40)
        email = models.EmailField()
        def __unicode__(self):
            return u'%s %s' % (self.first_name, self.last_name)
    
    class Book(models.Model):
        title = models.CharField(max_length=100)
        authors = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher)
        publication_date = models.DateField()
        num_pages = models.IntegerField(blank=True, null=True)
    
        def __unicode__(self):
            return self.title

    展开全文
  • 主要介绍了django模型动态修改参数,增加 filter 字段的方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • # 动态查询的字段 } # 选择deleted_datetime为空的记录 if exclude_deleted: kwargs[ 'deleted_datetime__isnull' ] = True # 选择特的category if category is not None: kwargs[ 'category' ] = c...
        
    kwargs = {
    # 动态查询的字段
    }
    
    # 选择deleted_datetime为空的记录
    if exclude_deleted:
    kwargs[ 'deleted_datetime__isnull' ] = True
    
    # 选择特的category
    if category is not None:
    kwargs[ 'category' ] = category
    
    # 特定的用户
    if current_user_only:
    kwargs[ 'user' ] = current_user
    
    # 根据标题查询
    if title_search_query != '':
    kwargs[ 'title__icontains' ] = title_search_query
    
    # 应用所有的查询
    entries = Entry.objects.filter( **kwargs )
    # 打印出所有的结果检查
    print entries 
    

    用这种方式,在Q object 方式下,是有问题的,要采用如下方式:

    kwargs = { 'deleted_datetime__isnull': True }
    args = ( Q( title__icontains = 'Foo' ) | Q( title__icontains = 'Bar' ) )
    entries = Entry.objects.filter( args, **kwargs )
    展开全文
  • 按以前的方法就是直接在sql语句里写各字段就行了,但django使用模型来操作数据库,就不能这样操作了 比如输入是book则过滤字段为title,输入是price则获取大于price的数据,输入author则过滤字段为关联表author中的...

    按以前的方法就是直接在sql语句里写各字段就行了,但django使用模型来操作数据库,就不能这样操作了
    比如输入是book则过滤字段为title,输入是price则获取大于price的数据,输入author则过滤字段为关联表author中的name
    可以将过滤条件组成一个字典,然后以关键字参数形式传递进去

    def book_list(request, item, data):
        item_dict = {
            'book': 'title',
            'author': 'authors__name',
            'publisher': 'publisher__name',
            'price': 'price__gt'
        }
        books = get_list_or_404(Book, **{item_dict[item]: data})
        return render(request, 'books/book_list.html', {'book_list': books})
    
    展开全文
  • 搞清楚Django模型字段是如何实现的? Django里常常有这样的代码: class MyModel(models.Model): name = models.CharField(verbose_name='姓名', max_length=10) age = models.PositiveIntegerField(verbose_...
  • Django 动态建表

    2019-04-19 17:09:00
    #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Random_lee # -*- coding: utf-8 -*- ...# name是表名,fields是字段,app_label是你的应用名(如:flow),module是应用下的模型(如:flow.mode...
  • Django REST Framework序列化程序的灵活,动态字段和嵌套模型。 总览 用于FlexFields(DRF-FF)是一个软件包,旨在为在DRF序列化程序中动态设置字段和嵌套模型提供功能的通用基准。 该软件包的设计旨在简化,与DRF...
  • F可以帮我们取到表中某个字段对应的值来当作我的筛选条件,而不是我认为自定义常量的条件了,实现了动态比较的效果。 Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。基于此可以对表中的...
  • 自定义Serializer序列化字段动态改变field参数 问题案例 在使用Django时候,经常需要用到rest_framework中的Serializer来序列化返回的Model数据。 如果你遇到这么个场景,你有一个User模型,在某个场景用户有权限...
  • Django模型层补充

    2019-06-13 20:02:00
    F可以帮我们取到表中某个字段对应的值来当作我的筛选条件,而不是我认为自定义常量的条件了 实现了动态比较的效果: 例如:查询卖出大于库存数 from django.db.models import F ret1=models.Product.objects....
  • 1、前端有需求,对同一个模型,某些页面仅需展示较为精简的几个字段,而有些页面则要展示更为详细的模型信息。 2、业务有需求,模型所涉及的字段本身是动态变化的,比如一个账号系统模型,创建账号时根据账号类型的...
  • F可以帮我们取到表中某个字段对应的值来当作我的筛选条件,实现了动态比较的效果 查询卖出数大于库存数的商品 # from django.db.models import F,Q # F查询 # res = models.Product.objects.filter(maichu__gt=F...
  • 文章目录内容介绍ModelSerializer基本代码块业务举例指定序列化字段嵌套序列化自定义声明字段只读字段附加参数HyperlinkedModelSerializer超链接映射关系确认ListSerializer动态自定义配置 内容介绍 开发项目是和 ...
  • 模型.objects的类型是Manager,继承自BaseManager的from_queryset方法,实现动态添加属性和方法到类中。exclude方法排除满足条件的数据;order_by方法根据字段进行排序;values方法指定字段提取数据并返回字典;...
  • Django Web框架03

    2020-10-24 17:22:06
    - app创建应用app应用的结构应用的分布式路由include 函数应用的模板模型Django下配置使用 mysql 数据库模型(Models)Django 的 ORM框架模型示例模型类Models 创建字段类型字段选项Meta内部类数据库迁移的错误...
  • django教程03-maoz

    2021-03-23 14:33:17
    - app创建应用app应用的结构应用的分布式路由include 函数应用的模板模型Django下配置使用 mysql 数据库模型(Models)Django 的 ORM框架模型示例模型类Models 创建字段类型字段选项Meta内部类数据库迁移的错误...
  • 1.字段分析 文件url 文件名 文件标题 简介 封面图片url 2.模型定义 # 在doc/models.py中定义如下模型 from django.db import models from utils.models import BaseModel class Doc(BaseModel): """ 文件模型...
  • django-generate添加了一个名为generate的管理命令,该命令允许您根据动态创建的JSON描述创建对象。 它的主要重点是生成测试内容,以供在项目开发和测试中使用。 对象只能通过Django的get_or_create方法创建一次。 ...
  • django dynamic models and field injections

    千次阅读 2013-10-14 21:23:45
    如同java优秀的ORM框架 hibernate 一样,django也有动态模型字段注入注入功能。但是截至1.5版本,未将此功能纳入官方文档对外开放。 主要原因个人觉得有二:第一,不可测性。目前django的单元测试框架不能有效的...
  • - app创建应用app应用的结构应用的分布式路由include 函数应用的模板模型Django下配置使用 mysql 数据库模型(Models)Django 的 ORM框架模型示例模型类Models 创建字段类型字段选项Meta内部类数据库迁移的错误...
  • Django 模式简介 / 模型简介 编写 Model / Model 字段分解 数据迁移 05 - View 视图初探 第一个视图 网站后台概念 / 创建管理员 / 注册 app 检视数据库 06 - View 及 Template 改写视图函数 编写模板 / 错误分析...
  • Django框架笔记(三)

    2020-06-24 23:43:24
    学习Django框架的第三天笔记 目录 静态文件 Django中的应用 app 什么是应用(app) 创建应用app ...不能与服务器端做动态交互的文件都是静态文件 如:图片,css,js,音频,视频,html文件(部分) 2.静态文件配置
  • 主要实现DRF(Django Restful Framework),先通过普通方式实现商品详情页,再通过DRF的各种View实现,最后实现过滤(包括字段过滤、搜索和筛选)。 V1.3 先通过嵌套方式实现商品类别数据接口,再通过Vue展示商品...
  • Ajax-django-files-widget.zip

    2019-09-17 12:30:59
    Ajax-django-files-widget.zip,django>=1.9ajax上传小部件和多个文件或图像的模型字段,具有拖放上传、上传进度条、可排序图像库,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和...
  • Django学习笔记(五)

    2021-05-13 21:13:35
    Django学习笔记(五) MVC和MTV对比 传统的MVC(Model-View-Controller) M 模型层,主要是对数据库层的封装 V 视图层,向用户展示结果 C 控制层,用于请求,获取数据和...模板可以根据视图层中传递的字段数据动态生成相
  • 后台首页菜单根据用户权限动态生成,不同菜单对应不同的功能视图。菜单的增删改查。 2.功能分析 菜单列表 添加菜单 修改菜单 删除菜单 3.模型设计 字段分析 name url parent order permission icon codename is_...

空空如也

空空如也

1 2
收藏数 40
精华内容 16
关键字:

django动态模型字段