django admin form 多选字段的几种实现方式
1. 走的model的manyotmanyfield -----------这里就不详细说明了,这很简单,默认配置走起
2.如下面例子----
a. 两个不关联的model怎么用manytomany字段,看下面的uids字段
b. 如何自定义多选字段不和model关联的, 看addons字段
class GMMailManager(models.Manager): """ """ pass def getaddons(): return ((1,1),(2,2)) from django import forms from django.contrib import admin from django.contrib.admin.widgets import FilteredSelectMultiple from django.contrib.auth.admin import GroupAdmin from django.contrib.auth.models import Group,User class GMMail(models.Model): """ @des: GM发送邮件 """ objects = GMMailManager() issendall = models.BooleanField(_(u"是否发送给全部玩家"),default=False) uids = models.TextField(_(u"玩家昵称对应的uids"),default="") title = models.CharField(_(u"邮件标题"),max_length=200,default="") content = models.TextField(_(u"邮件内容"),max_length=500, default="") addons = models.CharField(_(u"选择奖励附件类型"),max_length=100, default=None) addonscount = models.CharField(_(u"附件对应的数量"), max_length=100, default=None) oper = models.CharField(_(u"操作人"),max_length=100,default="") createtime = models.DateTimeField(_(u"创建时间"),auto_now_add=True) sendtime = models.DateTimeField(_(u"发送时间"),null=False, blank=False) class Meta: verbose_name = _(u'GM发送邮件') verbose_name_plural = verbose_name db_table = 'gmmail' from player.models import Player class GMMailForm(forms.ModelForm): uids = forms.ModelMultipleChoiceField(label=_(u"玩家昵称"), queryset=Player.objects.all(), widget=FilteredSelectMultiple('uids', False), required=False) addons = forms.MultipleChoiceField(label=_(u"选择奖励附件类型"), choices=lazy(getaddons,tuple)(), widget=FilteredSelectMultiple('addons', False),) class Meta: model = GMMail fields = '__all__' # def __init__(self, *args, **kwargs): # instance = kwargs.get('instance', None) # if instance is not None: # initial = kwargs.get('initial', {}) # initial['users'] = instance.user_set.all() # kwargs['initial'] = initial # super(GroupAdminForm, self).__init__(*args, **kwargs) # # def save(self, commit=True): # group = super(GroupAdminForm, self).save(commit=commit) # # if commit: # group.user_set = self.cleaned_data['users'] # else: # old_save_m2m = self.save_m2m # def new_save_m2m(): # old_save_m2m() # group.user_set = self.cleaned_data['users'] # self.save_m2m = new_save_m2m # return group class GMMailAdmin(YAdmin): list_display = ('uids',) readonly_fields = ('oper','createtime') form = GMMailForm def get_queryset(self, request): queryset = super(GMMailAdmin,self).get_queryset(request) if not request.user.is_superuser: queryset = queryset.filter(oper=request.user.username) return queryset def has_delete_permission(self, request, obj=None): return False def has_change_permission(self, request, obj=None): """ @des:注意这里虽然有修改权限,但是是为了查看,在save_model里面做修改,让其没有修改权限 """ return True def response_add(self, request, obj, post_url_continue=None): """ @des:这里可以自定义 创建对象后的 出错信息-----修改对象用response_change, 删除对象用resonse_delete """ #如果有出错消息 if messages.get_messages(request): #在页面上回填信息 return HttpResponseRedirect(".") #end--如果没有出错消息 return super(GMMailAdmin, self).response_add(request, obj, post_url_continue) def response_change(self, request, obj): """ @des:这里可以自定义 创建对象后的 出错信息-----修改对象用response_change, 删除对象用resonse_delete """ #如果有出错消息 if messages.get_messages(request): return HttpResponseRedirect(".") #end--如果没有出错消息 return super(GMMailAdmin, self).response_change(request, obj) def save_model(self, request, obj, form, change): """ @des:修改本model的数据 @超级坑: save_model是在事务里面执行的,所以,除了这个方法执行完后,才会有订单,订单记录等,被坑惨了, 就算transaction.savepoint_commit都不行 """ if change is False:#是创建--那么执行补单逻辑 return else:#如果是修改,那么不允许修改 messages.error(request, u'不允许修改')
3.自定义从后台查询的
需要自定义widget字段,
从FilteredSelectMultiple继承,修改相关的js即可--还未实现