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()