z0crm技巧,admin技巧

1.打包后需要将settings.py里相关路径做修改
2. collectstatic后需要把src/z0crm/static/admin/js/SelectBox.js拷贝到apache制定的static中,这里应该是部署的一个bug








技巧:
1. admin的表单字段简单修改(lmh发现)

class NcontractApprovedAdmin(BaseAdmin):
    #inlines设置
    change_form_template = "admin/z0crm/buinesstalk/reback_hetong_yuan_gong.html"
    search_fields = ['contractnum','clientele']
    list_filter = ()
    list_per_page = 20
    list_display = ['clientele', 'contractnum', 'createdate',
                    'contact', 'jump_to_PRINT', 'jump_to_excel']
    form = NcontractApprovedForm
    inlines = [PCSetReadOnlyInline,]
    fields = ['jump_to_afile']  #这里特别注意可以把属性作为field的字段,但是必须不能为readonly
    def jump_to_PRINT(self, obj):
        #return "预约排期"
        htmlaction = u"""
                       预约排期
                    """ % obj.id
        return u'打印合同\
                  %s' % (obj.id,htmlaction)
    jump_to_PRINT.short_description = u'可操作'
    jump_to_PRINT.allow_tags = True
    
    def jump_to_afile(self, obj):
        '''
        @des:跳转到下载合同附件
        '''

        arr = obj.afile.name.split('/')
        name = arr[len(arr) - 1]
        return '%s' % (obj.afile, name.encode("utf-8"))
        
    jump_to_afile.short_description = '附件'
    jump_to_afile.allow_tags = True


2. admin的默认js修改(hx发现的)
   比如修改多项选择框:
   admin/static/admin/js/SelectBox.js
   把这个js复制到你的项目对应的路径static/admin/js/下,即可修改
   
   SelectBox.js里的方法很有用
 
3. admin多项选择框里的选项可以根据你需要的任何信息过滤,比如拼音简码,性别,前提是定义选项框对象的def __unicode__方法的时候要把这些信息加入进去



4. 给form动态添加属性

  A: 普通adminform属性设置
     class ProjectWaitingRegisterationApproveForm(forms.ModelForm):

        class Meta:
            model = ProjectWaitingRegisterationApprove
            widgets = {
                'registeration_approved_by': forms.TextInput(attrs={'size': 20, 'title': '审核人', 'readonly': True}),
                'registeration_approved_datetime': SplitDateTimeWidget(attrs={'size': 20, "readonly":"true"}),
            }

        def __init__(self, *args, **kwargs):
            if "initial" not in kwargs:
                kwargs["initial"] = {}
            kwargs["initial"]['registeration_approved_by'] = self.request.user.username
            kwargs["initial"]['registeration_approved_datetime'] = datetime.datetime.now()
            super(ProjectWaitingRegisterationApproveForm, self).__init__(*args, **kwargs)


    class ProjectWaitingRegisterationApproveAdmin(admin.ModelAdmin):
        form = ProjectWaitingRegisterationApproveForm

        def get_form(self, request, *args, **kwargs):
            self.form.request = request #这里设置
            form = super(ProjectWaitingRegisterationApproveAdmin, self).get_form(request, *args, **kwargs)
            return form

        def queryset(self, request):
            qs = super(ProjectWaitingRegisterationApproveAdmin, self).queryset(request)
            return qs.filter(registered=False)



  B:inlineform的属性设置

   class setmeatInlineForm(forms.ModelForm):
    u'''
        待审核方案表单重载
    '''
    sumaryprice = forms.DecimalField(label=u'套餐总金额', required=False, max_digits=19, decimal_places=2,
                               widget=forms.TextInput(attrs={ 'readonly': True}))
    price = forms.CharField(label=u'套餐报价', required=False,
                               widget=forms.TextInput(attrs={ 'readonly': True}))
    
    packs = forms.CharField(label=u'可选项目套餐', required=False,
                              widget=DisplayHtmlInput(attrs={'style':'color:green'}))
    class Meta:
        model = setmeat
        
    def __init__(self, *args, **kwas):
        """
        给字段设置初始值
        """
        #self.parent_obj = None  #这里千万不能在这里初始化一个属性,不然会覆盖admin动态设置form的属性
        print "*"*500
        print self.parent_obj   #这里是在下面的setmeatInline里设置
        instance = kwas.get('instance', None)
        initial = kwas.get('initial', {})
        if instance:
            initial.update({'sumaryprice':instance.sumaryprice})
            if instance.price !=None and instance.price != '':
                initial.update({'price':instance.price})
            else:
                initial.update({'price':"0.00"})
        else:
            initial.update({'sumaryprice':0})
            initial.update({'price':"0.00"})
        try:
            try:
                initial.update({'packs':pack.pack_dispaly(self.parent_obj.project_id)})
            except Exception,e:
                initial.update({'packs':pack.pack_dispaly()})
        except Exception,e:
            pass
        if not instance:
            super(setmeatInlineForm, self).__init__(initial=initial,*args, **kwas)
        else:
            super(setmeatInlineForm, self).__init__(initial=initial, *args, **kwas)
            
class setmeatInline(admin.StackedInline):
    form = setmeatInlineForm
    model = setmeat
    filter_horizontal = ('packitems',)
    extra = 0
    fields = ['scheme','name','packs','packitems','price','executeprice', 'executediscounter']
    def get_formset(self, request, obj=None, **kwargs):
        """
        """
        fs = super(setmeatInline, self).get_formset(request, obj, **kwargs)
        self.form.parent_obj = obj#动态设置inlineform的属性
        return fs
 
 
 
 
5.动态在models中加choices

  A:
    
    def get_ADDSERVICE():
    """
    动态加载choices
    """
    return Config.objects.get(slug = 'ADDSERVICE').v

    class BuinessTalkAdditionItem(models.Model):
        '''
        @des:商务谈判附加项目
        '''
        buinesstalk = models.ForeignKey(BuinessTalk, verbose_name=_(u"商务谈判"), related_name = "talk_fujia")
        additems = models.CharField(max_length = 120, default = u'0', choices = get_ADDSERVICE(), verbose_name=_(u"增值服务"))
        price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name=_(u"价格"))
        #executeprice = models.DecimalField(max_digits=8, decimal_places=2, verbose_name=_(u"执行价格"))
        #executediscounter = models.DecimalField(max_digits=8, decimal_places=2, verbose_name=_(u"执行折扣率"),blank=True,null=True)
        #counterp = models.IntegerField(verbose_name = _(u"附加项目人数"))
        
        def __init__(self, *args, **kwargs):
            """
            动态加载choices
            """
            super(BuinessTalkAdditionItem, self).__init__(*args, **kwargs)
            self._meta.get_field_by_name('additems')[0]._choices = \
                                lazy(get_ADDSERVICE,tuple)()

   B:
        from django.utils.functional import lazy
        def get_ADDSERVICE():
            """
            动态加载choices
            """
            return Config.objects.get(slug = 'ADDSERVICE').v

        class BuinessTalkAdditionItem(models.Model):
            '''
            @des:商务谈判附加项目
            '''
            buinesstalk = models.ForeignKey(BuinessTalk, verbose_name=_(u"商务谈判"), related_name = "talk_fujia")
            additems = models.CharField(max_length = 120, default = u'0', choices = lazy(get_ADDSERVICE,tuple)(), verbose_name=_(u"增值服务"))
            price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name=_(u"价格"))



6. form使用技巧,不用request的form
   class AnimalForm(ModelForm):
    class Meta:
        model = Animal
        exclude = ('publisher',)
... and in the view:

    form = AnimalForm(request.POST)
    if form.is_valid():
        animal = form.save(commit=false)
        animal.publisher = request.user
        animal.save()

分享到: 微信 更多