环境:
zinnia版本是0.14.2, django 1.6
zinnia支持多用户发博文,但需要自己实现。
现在需要,每个用户有自定义的分类,自己编辑属于自己的category,发布文章时,只能选择自己的category。
在/zinnia/admin/forms.py中,使用模块crum读取用户id,进行category的过滤,不被推荐,而且容易出错。
EntryAdminForm类中,定义了一个categories字段:
categories = MPTTModelMultipleChoiceField(
label=_('Categories'), required=False,
queryset=Category.objects.all(),
widget=MPTTFilteredSelectMultiple(_('categories'), False,
attrs={'rows': '10'}))
在/zinnia/admin/entry.py里,重写一下admin.ModelAdmin的add_view方法:
def add_view(self, request, form_url='', extra_context=None):
self.form.declared_fields['categories'].queryset = Category.objects.filter(user_id=request.user.id)
response = super(EntryAdmin, self).add_view(request, form_url, extra_context)
return response
这里要访问categories字段,使用 declared_fileds列表。form的定义是: form = EntryAdminForm
这个方法要返回父级方法的结果。
另:
在Category表中添加user字段:
user = models.ForeignKey(User, related_name='user_id')
重写一下/zinnia/admin/category.py中的save_model方法:
def save_model(self, request, category, form, change):
category.user_id = request.user.id
category.save()
重写get_queryset方法:
def get_queryset(self, request):
qs = Category.objects.filter(user_id=request.user.id)
return qs
重写 add_view方法:
def add_view(self, request, form_url='', extra_context=None):
self.form.declared_fields['parent'] = TreeNodeChoiceField(
label=_('Parent category'),
level_indicator='|--', required=False,
empty_label=_('No parent category'),
queryset=Category.objects.filter(user_id=request.user.id))
response = super(CategoryAdmin, self).add_view(request, form_url, extra_context)
return response
这个用来实现添加分类的父分类的过滤。
或者写为:
self.form.declared_fields['parent'].queryset = Category.objects.filter(user_id=request.user.id)
比重新赋值简捷