問題描述:
在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()
結果如下:
分類的編輯頁面: