写于2010年11月6日
今天主要是想把admin中的一个图集的cover 在编辑的时候,限定为该图集所属的图片中,但是没有发现好的方法。我使用了2种尝试。
一种是在models.py中的gallery的init函数中初始化cover的可选值:
#def __init__(self, *args, **kwargs): # #self.cover.choices = self.photos.all() # o=self.cover # super(Gallery, self).__init__(*args, **kwargs) # #self.set_cover_choices() # self.cover.queryset = self.photos.all() #def set_cover_choices(self): # p=self.photos.all() # o=type(self.cover) # self.cover.choices = self.photos.all()
但是init根本不行,说cover是个nonetype,也就是说cover根本 就没有被初始化。
第二种就是改admin.py了
class GalleryAdmin(admin.ModelAdmin): list_display = ('title', 'date_added', 'photo_count', 'is_public') list_filter = ['date_added', 'is_public'] date_hierarchy = 'date_added' prepopulated_fields = {'title_slug': ('title',)} filter_horizontal = ('photos',) def formfield_for_dbfield(self, db_field, **kwargs): field = super(GalleryAdmin, self).formfield_for_dbfield(db_field, **kwargs) # Get the default field if db_field.name == 'cover': my_choices = [('', '---------'),('1',"fff")] #my_choices.extend(Photo.objects.filter(gallery=实例化的gallery).values_list('id','name')) #print my_choices d=dir(self) p=dir(self.model) q=self.model.cover g() field.choices = my_choices return field
但是问题是,不知道怎么获取该GalleryAdmin具体实例化时使用的Gallery是哪个,因此搁浅。
另外通过查看admin的代码,知道
# DEPRECATED methods. # def __call__(self, request, url): This function still exists for backwards-compatibility; it will be removed in Django 1.3.
也就是说在django1.3中,这种call的方式来获取request的方法,进而获取当前登录用户的方法可能要失败了。这个我在blog中使用过,从国外的朋友那里借过来的方法。
想了又想,admin真的是个鸡肋,看来以后的方向就是减少甚至不在admin的界面上作什么优化了,把功夫下在前台上。Admin的管理功能的增强还不如放在前面呢,这样在view中处理什么都很方便的。
傻逼的admin。
实在不行的话,我只好再下点精力转向pylons那种自由的东西了,告别django种种的鸡肋模块,如orm,如urlconf,如模板渲染语言,等等,真的是,要找django的缺点,真是一大堆。