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即可--还未实现