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 }} 最后就是这样了,还凑合。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。