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


分享到: 微信 更多