GsonGson12-12 02:42

Django小技巧

Django-Celery


  1. pip install django-celery(应该会自动安装celery等依赖项)
  2. 在setting文件中的INSTALLED_APPS里面添加‘djcelery’项以及添加如下代码:
import djcelery
from celery.schedules import crontab
djcelery.setup_loader()  # 能自动识别用户app下tasks.py里面的被@task装饰的函数
BROKER_URL = 'redis://127.0.0.1:6379/1'  # 需要确保redis启动。
CELERY_RESULT_BACKEND = 'redis://localhost:6379/1'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
  1. 执行python manage.py syncdb创建celery相关数据表。
  2. 在自己的app目录下创建tasks.py文件,并加入如下代码:
from celery import task
@task
def my_task_func():
    # here, write my code
  1. 执行python manage.py celery worker启动worker,一个负责执行task的进程
  2. 若是执行定时任务,还需要执行python manage.py celery beat开启心跳进程
    (用于监听什么时候应该执行task,并在应当执行时刻,发送信号给worker,然后worker执行task任务 )
  3. 运行django项目,进入admin后台的djcelery模块,添加定时任务。

Django-admin


** Django-admin中自定义后台的显示方式 **

from django.utils.html import format_html
class TestModel(models.Model):
   GENDER_CHOICES = ((-1, u'女'),(0, u'不详'),(1, u'男'))   
   name = models.CharField(max_length=12)   
   gender = models.SmallIntegerField(u'性别', choices=GENDER_CHOICES)

class TestModelAdmin(admin.ModelAdmin):
   list_display = ('id', 'name', 'gender', 'colored_gender')    
   # 自定义gender显示field
   def colored_gender(self, obj):  # 自定义函数,包含两个参数,obj代表数据对象        
       color = ''
       if obj.gender == -1:  # 女
           color = '#12d012'
       elif obj.gender == 0:  # 未知
           color = 'red'
       elif obj.gender == 1:  # 男
           color = 'yellow'
       # 这行中的get_gender_display()函数为django model自带的特殊方法,具体名称为get_FIELD_display()
       # 功能是获取FIELD列的显示字符。特别地,对于有choices选项的field有效(其会返回choices中的对应字符)。
       # format_html函数使得后台显示时不会按照字符串显示,而是以html的形式。
       return format_html('%s' %  (color, obj.get_gender_display()))
   colored_gender.short_description = "性别"    # 此行使得自定义的field可以按照模型的gender排序。并使得后台显示的列名与原生的列有相同样式
   colored_gender.admin_order_field = "gender"

** Django-admin中的添加数据表单时,选择外键的数据需要过滤时 **

class TestModel(models.Model):    
    user = models.ForeignKey(User, limit_choices_to={'is_admin': True},)

这样之后,在后台选择user时,就只会将User表中是admin的用户显示出来。

官场书屋二维码

小额赞赏

000
评论