使用django创建自己的徽章引擎的可重用应用程序
django-badgify-lab的Python项目详细描述
这个django应用程序将帮助您在您的网站上创建自己的徽章系统。
它已经在Ulule上用于创建我们自己的badge mechanism。
安装
$ pip install django-badgify
用法
将badgify添加到settings.py中的INSTALLED_APPS:
INSTALLED_APPS=(# ...'badgify',)
同步数据库:
$ python manage.py migrate badgify
在django应用程序中创建一个badgify_recipes.py文件:
$ cd path/to/your/django/app
$ touch badgify_recipes.py
打开此文件并导入badgify.recipe.BaseRecipe
类和badgify
模块:
frombadgify.recipeimportBaseRecipeimportbadgify
创建并注册配方类:
classPythonLoverRecipe(BaseRecipe):passclassJSLoverRecipe(BaseRecipe):pass# Per classbadgify.register(PythonLoverRecipe)badgify.register(JSLoverRecipe)# All at once in a listbadgify.register([PythonLoverRecipe,JSLoverRecipe])
配方类必须实现:
- name类属性
- 徽章名称(人性化)。
- image属性
- 作为文件对象的徽章图像/徽标。
配方类可以实现:
- slug类属性
- 徽章slug(在内部和url中使用)。 如果没有提供,它将根据徽章名称自动生成。
- description类属性
- 徽章说明(简短)。 未提供,值将为空。
- user_ids属性
- QuerySet返回可能被授予的用户id。您必须返回 QuerySet,而不仅仅是python列表或元组。你可以用 values_list('id', flat=True).
- db_read类属性
- 要对其执行读取查询的数据库别名。 默认为django.db.DEFAULT_DB_ALIAS。
- batch_size类属性
- 一次要创建多少个Award对象。 默认为BADGIFY_BATCH_SIZE(500)。
示例:
fromdjango.contrib.staticfiles.storageimportstaticfiles_storagefrombadgify.recipeimportBaseRecipeimportbadgifyfrom.modelsimportMyCustomUserclassPythonLoverRecipe(BaseRecipe):""" People loving Python. """name='Python Lover'slug='python-lover'description='People loving Python programming language'@propertydefimage(self):returnstaticfiles_storage.open('python-lover.png')@propertydefuser_ids(self):return(MyCustomUser.objects.filter(love_python=True).values_list('id',flat=True))classJSLoverRecipe(BaseRecipe):""" People loving JS. """name='JS Lover'slug='js-lover'description='People loving JS programming language'@propertydefimage(self):returnstaticfiles_storage.open('js-lover.png')@propertydefuser_ids(self):return(MyCustomUser.objects.filter(love_js=True).values_list('id',flat=True))classJavaLoverRecipe(BaseRecipe):""" People loving Java. """name='Java Lover'slug='java-lover'description='People loving Java programming language'@propertydefimage(self):returnstaticfiles_storage.open('java-lover.png')badgify.register([PythonLoverRecipe,JSLoverRecipe,JavaLoverRecipe,])
一旦实现并注册了配方类,就可以调用 可用命令如下:
# Create badges from recipes $ python manage.py badgify_sync badges # Update badges from recipes $ python manage.py badgify_sync badges --update # Create awards $ python manage.py badgify_sync awards # Create awards bypassing signals (improve performances) $ python manage.py badgify_sync awards --disable-signals # Only create awards for "python" badge $ python manage.py badgify_sync awards --badges python # Only create awards for "python" and "go" badges $ python manage.py badgify_sync awards --badges "python go"# Create awards for all badges, except "php" $ python manage.py badgify_sync awards --exclude-badges php # Create awards for all badges, except "php" and "java" $ python manage.py badgify_sync awards --exclude-badges "php java"# Denormalize Badge.users.count() into Badge.users_count field $ python manage.py badgify_sync counts # Only denormalize counts for "python" badge $ python manage.py badgify_sync counts --badges python # Denormalize counts for all badges, except "php" $ python manage.py badgify_sync counts --exclude-badges php # Denormalize counts for all badges, except "php" and "java" $ python manage.py badgify_sync counts --exclude-badges "php java"# Typical workflow for best performances $ python manage.py badgify_sync badges $ python manage.py badgify_sync awards --disable-signals $ python manage.py badgify_sync counts # WARNING: if you delete awards to start again with a fresh table # don't forget to update Badge.users_count field. Or use this command: $ python manage.py badgify_reset # Typical workflow for best performances if you want to recompute awards $ python manage.py badgify_reset $ python manage.py badgify_sync awards --disable-signals $ python manage.py badgify_sync counts
视图
django badgify提供两个视图:
- badgify.views.BadgifyListView:将所有徽章显示为分页列表
- badgify.views.BadgifyDetailView:将授予的用户显示为给定徽章的分页列表
此应用程序不包括模板。它允许您实现 您喜欢的模板(请参见示例项目)。
要包含这两个视图,请包含提供的badgify.urls:
# -*- coding: utf-8 -*-fromdjango.conf.urlsimportinclude,urlurlpatterns=[# Your other includesurl(r'^badges/',include('badgify.urls')),]
有关更多详细信息,请参见示例项目。
定制型号
django badgify允许您为Badge和^{tt16}定义自己的模型类$ 模型。这对i18n很有用 (例如:django-transmetta支持) 添加自定义字段、方法或属性。
您的模型必须继承自badgify.models.basemodel类:
# yourapp.modelsfrombadgify.modelsimportbaseclassBadge(base.Badge):# you own fields / logic hereclassMeta(base.Badge.Meta):abstract=FalseclassAward(base.Award):# you own fields / logic hereclassMeta(base.Award.Meta):abstract=False
然后告诉应用程序用它们代替settings.py模块中的默认值:
# yourapp.settingsBADGIFY_BADGE_MODEL='yourapp.models.Badge'BADGIFY_AWARD_MODEL='yourapp.models.Award'
设置
可以通过在^{tt3}中定义设置来更改应用程序行为$ 模块。
所有应用程序设置的前缀都是BADGIFY_。
BADGIFY_BADGE_IMAGE_UPLOAD_ROOT
Badge模型ImageField的根路径。
BADGIFY_BADGE_IMAGE_UPLOAD_URL
url Badge模型ImageField。
BADGIFY_BADGE_IMAGE_UPLOAD_STORAGE
您自己的django.core.files.storage存储实例。
BADGIFY_BADGE_LIST_VIEW_PAGINATE_BY
要在徽章列表页上显示的徽章数。
BADGIFY_BADGE_DETAIL_VIEW_PAGINATE_BY
要在徽章详细信息页上显示的授予用户数。
BADGIFY_BADGE_MODEL
您自己的具体Badge模型类作为模块路径。
示例:yourapp.models.Badge。
BADGIFY_AWARD_MODEL
您自己的具体Award模型类作为模块路径。
示例:yourapp.models.Award。
BADGIFY_BATCH_SIZE
最大值一次要创建的Award对象的最大数目。
默认为500。
贡献
# Don't have pip? $ sudo easy_install pip # Don't already have virtualenv? $ sudo pip install virtualenv # Clone and install dependencies $ git clone https://github.com/ulule/django-badgify.git $ cd django-badgify $ make install # Launch tests $ make test# Launch example project $ make create_fixtures $ make serve
兼容性
- python 2.7:django 1.9,1.10
- Python3.4:django 1.9,1.10
- Python3.5:django 1.9,1.10