打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Django中使用admin的多选widget插件FilteredSelectMultiple

Django 的自带后台admin中多于manytomany类型可以进行如下定制:

models.py# coding:utf-8from django.db import modelsfrom django.core.urlresolvers import reverseclass Ingredient(models.Model): # dish = models.ManyToManyField(Dishes, verbose_name=u'菜品') name = models.CharField(verbose_name=u'食材名称', max_length=128) tip = models.TextField(verbose_name=u'备注说明', blank=True) def __unicode__(self): return self.name def get_absolute_url(self): return reverse('ingredient_detail', kwargs={'pk': self.pk})class Dishes(models.Model): name = models.CharField(verbose_name=u'菜品名称', max_length=250) description = models.TextField(verbose_name=u'介绍', blank=True) create_date = models.DateField(verbose_name=u'加入时间', auto_now_add=True) last_date = models.DateField(verbose_name=u'最后编辑时间', auto_now=True) ingredient = models.ManyToManyField(Ingredient, verbose_name=u'食材列表') def __unicode__(self): return self.name def get_absolute_url(self): return reverse('dishes_display_detail', kwargs={'pk': self.pk})


admim.pyfrom django.contrib import adminfrom dishes.models import *class IngredientInline(admin.TabularInline): model = Ingredientclass StepInline(admin.TabularInline): model = Stepclass DishesAdmin(admin.ModelAdmin): inlines = [StepInline, ] filter_horizontal = ('ingredient',)admin.site.register(Dishes, DishesAdmin)admin.site.register(Ingredient)

会得到如下的多选插件



个人觉得这个很爽。比其他Bootstrap Dual Listbox是要难看点,不过也好用,而且本身就在Django里,so尝试用在自己代码中。不过问题是,搜索了下好像还没人这么做过。所以开始一下历程。

forms.pyfrom django import formsfrom django.forms import ModelFormfrom django.utils.translation import ugettext_lazy as _from django.contrib.admin.widget import FilteredSelectMultiplefrom .models import *class MyFilteredSelectMultiple(FilteredSelectMultiple): ''' 这里手动添加Ingredient,那个绿色的小加号。在源代码中没看出来是在哪里生成的,有网友知道的话还麻烦告诉我下。 '''    def render(self, name, value, attrs=None, choices=()):        output = [super(MyFilteredSelectMultiple, self).render(name, value, attrs, choices)]        output.append(        '

'        )        return mark_safe(''.join(output))class DishesEditForm(forms.ModelForm):       ingredient = forms.ModelMultipleChoiceField(queryset=Ingredient.objects.all(),                                                label=u'控件显示lable,对应于model的verbose_name',                                                widget=MyFilteredSelectMultiple(                                                    verbose_name=u'多选控件两栏显示的标题名称',                                                    is_stacked=False,                                                    attrs={}                                                ),                                                required=False    )    class Meta:        model = Dishes        fields = '__all__'        widgets = {        }        labels = {            'name': _(u'菜品名称~!哟'),        }        help_texts = {            'name': _(u'Help Dishes name')        }        error_messages = {            'name': {                'max_length': _(u'必须在125个字以内'),            }        }


view.pyfrom django.views.generic import UpdateViewfrom .form import DishesEditFormfrom .models import *class DishesEdit(UpdateView): model = Dishes form_class = DishesEditForm template_name = 'dishes_edit.html'

dishes_edit.html {% load static %}                {{ form.media }}   
                            {{ form.as_table }}
           
{# {{form.ingredient #}

最后就是这样了,还凑合。






本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
模块二 Unit3 Grammar and usage
买房子出租之后,怎么知道每年自己需要缴纳的税有多少?
使用jquery提交form表单
C#防止WebBrowser在新窗口中打开链接页面 | 真有意思
以频道方式打开窗口——网页特效
form = form(形状),to form(形成)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服