gpt4 book ai didi

Django:在管理页面上显示反向外键查找,作为只读列表?

转载 作者:行者123 更新时间:2023-12-03 13:58:26 26 4
gpt4 key购买 nike

我想在 Django 管理页面上显示反向外键查找,并将其设为只读,作为一个轻量级的字符串列表。

执行此操作的标准方法似乎是使用内联管理字段,但我不希望它可编辑,所以我想知道是否有更轻量级的方法来做到这一点。

这些是我的领域:

class Book: 
title = models.TextField(blank=True)
author = models.ForeignKey(Author, on_delete=models.PROTECT)

class Author:
name = models.TextField(blank=True)

在作者的管理员更改/删除页面上,我想显示他们书籍的只读列表。

我可以用 admin.StackedInline 做到这一点,但是让它只读是很麻烦的:
class BooksInline(admin.StackedInline):
model = Book
fields = ('title',)
readonly_fields = ('title',)

def has_add_permission(request, obj):
return False

def has_delete_permission(request, obj, self):
return False

生成的列表在页面上占用了大量空间,因为设计期望所有内容都是可编辑的。

有没有更简单的方法来制作只读列表?

最佳答案

我不喜欢在模型中包含仅限管理员的逻辑的想法,也不喜欢在不需要的情况下使用模板的想法,所以我在管理员中实现了这一点。

from django.contrib import admin

class AuthorAdmin(admin.ModelAdmin):
readonly_fields = ('books_list')
fields = ('name', 'books_list')

def books_list(self, obj):
books = Book.objects.filter(author=obj)
if books.count() == 0:
return '(None)'
output = ', '.join([unicode(book) for book in books])
return output
books_list.short_description = 'Book(s)'

对于奖励积分,我们可以将每本书链接到该书的更改页面。
from django.contrib import admin
from django.core import urlresolvers
from django.utils.html import format_html

class AuthorAdmin(admin.ModelAdmin):
readonly_fields = ('books_list')
fields = ('name', 'books_list')

def books_list(self, obj):
books = Book.objects.filter(author=obj)
if books.count() == 0:
return '(None)'
book_links = []
for book in books:
change_url = urlresolvers.reverse('admin:myapp_book_change', args=(book.id,))
book_links.append('<a href="%s">%s</a>' % (change_url, unicode(book))
return format_html(', '.join(book_links))
books_list.allow_tags = True
books_list.short_description = 'Book(s)'

双重奖励,您可以将其封装到一个函数中,这样您就不必每次在 Admin 中显示反向外键对象列表时都必须重写此逻辑:
from django.contrib import admin
from django.core import urlresolvers
from django.utils.html import format_html

def reverse_foreignkey_change_links(model, get_instances, description=None, get_link_html=None, empty_text='(None)'):
if not description:
description = model.__name__ + '(s)'

def model_change_link_function(_, obj):
instances = get_instances(obj)
if instances.count() == 0:
return empty_text
output = ''
links = []
for instance in instances:
change_url = urlresolvers.reverse('admin:%s_change' % model._meta.db_table, args=(instance.id,))
links.append('<a href="%s">%s</a>' % (change_url, unicode(instance))
return format_html(', '.join(links))

model_change_link_function.short_description = description
model_change_link_function.allow_tags = True
return model_change_link_function

class AuthorAdmin(admin.ModelAdmin):
readonly_fields = ('books_list')
fields = ('name', 'books_list')

def books_list = reverse_foreignkey_change_links(Book, lambda obj: Book.objects.filter(author=obj))

关于Django:在管理页面上显示反向外键查找,作为只读列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23070679/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com