问题描述:
在Django中,我们想在同一页面编辑关联对象的数据。如:
在博客的分类编辑页中,新建或者修改该分类下的文章。
代码如下:
from django.contrib import admin
from .models import Post, Category
# 在分类列表页面增加编辑文章的功能: 定义文章的Inline
class PostInline(admin.TabularInline): # StackedInline样式不同
# 要显示编辑的字段, 其中Post的category字段不需要设置,它默认的值就是当前编辑的分类。
fields = ('title', 'desc')
extra = 0 # 控制额外多几个空白记录
model = Post
# Register your models here.
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
inlines = [PostInline, ] # 添加文章的Inline
list_display = ('name', 'status', 'is_nav', 'owner', 'created_time', 'post_count')
fields = ('name', 'status', 'is_nav')
# 展示该分类下有多少文章
def post_count(self, obj):
return obj.post_set.count()
post_count.short_description = '文章数量'
def save_model(self, request, obj, form, change):
obj.owner = request.user
return super(CategoryAdmin, self).save_model(request, obj, form, change)
# 修改关联对象Post的数据
def save_formset(self, request, form, formset, change):
""" 修改关联对象Post的数据 """
instances = formset.save(commit=False)
for instance in instances:
if not hasattr(instance, 'owner'): # 防止误修改其他文章的作者
instance.owner = request.user # 给Post的owner字段赋值
instance.save()
formset.save_m2m()
代码分析:
因为我们的文章作者默认是设置为当前登录的用户,所以需要在CategoryAdmin中修改关联对象Post的数据,即给文章的作者赋值。
instance.owner = request.user # 给Post的owner字段赋值
instance.save()
结果如下:
分类的编辑页面: