我有一个与Book有外键关系的Person模型.本书有很多领域,但我最关心的是"作者"(标准的CharField).
话虽如此,在我的PersonAdmin模型中,我想使用"list_display"显示"book.author".我已经尝试了所有这些明显的方法(见下文),但似乎没有任何效果.有什么建议?
class PersonAdmin(admin.ModelAdmin):
list_display = ['book.author',]
Run Code Online (Sandbox Code Playgroud) 我在网上商店应用程序中有一个Orders模型,它有一个自动递增的主键和一个自己的外键,因为订单可以拆分成多个订单,但必须保持与原始订单的关系.
class Order(models.Model):
ordernumber = models.AutoField(primary_key=True)
parent_order = models.ForeignKey('self', null=True, blank=True, related_name='child_orders')
# .. other fields not relevant here
Run Code Online (Sandbox Code Playgroud)
我已经为管理站点注册了OrderAdmin类.对于详细视图,我已经包含parent_order在fieldsets属性中.当然,默认情况下,它会列出选择框中的所有订单,但这不是所需的行为.相反,对于没有父订单的订单(即未从另一个订单拆分; parent_order是NULL/None),不应显示任何订单.对于已拆分的订单,此应仅显示单个父订单.
有一个相当新的ModelAdmin方法formfield_for_foreignkey,这似乎是完美的,因为查询集可以在其中进行过滤.想象一下,我们正在查看订单#11234的详细视图,该订单已从订单#11208拆分.代码如下
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'parent_order':
# kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=11234)
return db_field.formfield(**kwargs)
return super(OrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
Run Code Online (Sandbox Code Playgroud)
注释行在Python shell中运行时返回,返回单项查询集,其中包含#11234的#11208订单以及可能已从中拆分的所有其他订单.
当然,我们不能在那里硬编码订单号.我们需要引用ordernumber订单实例的字段,我们正在查看其详细信息页面.像这样:
kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=?????)
Run Code Online (Sandbox Code Playgroud)
我发现没有办法替换????? 参考"当前"订单实例,我挖得很深.selfinside formfield_for_foreignkey指的是ModelAdmin实例,虽然它确实有一个model属性,但它不是订单模型实例(它是ModelBase引用; self.model()返回一个实例,但它的ordernumber是None).
一个解决方案可能是从request.path(/ admin/orders/order/11234 /)中提取订单号,但这真的很难看.我真的希望有更好的方法.
在Django的管理员中,我想禁用 "选择要更改的项目"页面上提供的链接,以便用户无法去任何地方编辑项目.(我将限制用户可以对此列表执行的操作到一组下拉操作 - 没有实际编辑字段).
我看到Django能够选择显示链接的字段,但是,我看不出我怎么也没有.
class HitAdmin(admin.ModelAdmin):
list_display = ('user','ip','user_agent','hitcount')
search_fields = ('ip','user_agent')
date_hierarchy = 'created'
list_display_links = [] # doesn't work, goes to default
Run Code Online (Sandbox Code Playgroud)
任何想法如何获取我的对象列表没有任何链接编辑?
我正在尝试更改django管理列表显示中对象的链接.这是我到目前为止:
class FooModelAdmin(admin.ModelAdmin):
fields = ('foo','bar')
list_display = ('foo_link','bar')
def foo_link(self,obj):
return u'<a href="/foos/%s/">%s</a>' % (obj.foo,obj)
domain_link.allow_tags = True
domain_link.short_description = "foo"
Run Code Online (Sandbox Code Playgroud)
这在原始列表显示链接中产生另一个链接,例如
<a href="/admin/app/model/pk/"><a href="/foos/foo/">Foo</a></a>
Run Code Online (Sandbox Code Playgroud) 使用Django Admin界面,您如何确保HTML select multiple中的对象按某种顺序排序(更喜欢按字母顺序)?问题是我有3个型号 - CD,Song,Singer.一个CD管理仪表板,宋是内联CD和歌手是一个很多的领域,我想排序!
我的model.py档案:
class CD(models.Model):
cd_name = models.CharField("CD Name",max_length=50)
date = models.DateField("CD Release Date")
photo = models.ImageField("CD Cover",blank=True,upload_to='covers')
singers = models.ManyToManyField(Singer,blank=True,null=True)
def __unicode__(self):
return self.cd_name
class Song(models.Model):
cid = models.ForeignKey(CD)
track_num = models.PositiveIntegerField("Track Number",max_length=2)
song_name = models.CharField("Song Name",max_length=50)
soloists = models.ManyToManyField(Singer,blank=True,null=True)
stream_url = models.URLField("Stream URL", blank=True)
def __unicode__(self):
return self.song_name
class Singer(models.Model): (not relevent)
Run Code Online (Sandbox Code Playgroud)
我的admin.py档案:
class SongInline(admin.TabularInline):
model = Song
extra = 0
class CDAdmin(admin.ModelAdmin):
list_display = ('cd_name', 'date')
inlines = [ …Run Code Online (Sandbox Code Playgroud) 我使用的鹡鸰的ModelAdmin模块(不一样的Django的ModelAdmin)将自定义添加Order模式,以鹡鸰管理。该模型具有自定义Address模型的外键。
我想Address在InspectView(已启用)中以内联方式显示模型(就像在django的admin中一样)。当前,它显示字符串表示形式。
使用 Wagtails 模型管理员:
有没有办法禁用编辑和删除选项,只留下检查视图?
我能想到的一种可能的方法是扩展模板,删除编辑和删除按钮,然后以某种方式禁用编辑和删除视图。
有没有更干净的方法?
编辑:多亏了 Loic 的回答,我才能弄清楚。
该PermissionHelper 源代码也非常有帮助找出覆盖的正确方法。
仅显示检查视图的完整答案
class ValidationPermissionHelper(PermissionHelper):
def user_can_list(self, user):
return True
def user_can_create(self, user):
return False
def user_can_edit_obj(self, user, obj):
return False
def user_can_delete_obj(self, user, obj):
return False
class ValidationAdmin(ModelAdmin):
model = Validation
permission_helper_class = ValidationPermissionHelper
inspect_view_enabled = True
[...]
Run Code Online (Sandbox Code Playgroud) 我在模型中有一个“必需”的字段(子项),但想将ModelAdmin类中的字段更改为可选字段。如果用户未填写,则会由另一个字段(名称)自动填写。
class SomeModel(model.Model):
name = model.CharField(max_length=255)
slug = model.SlugField(unique=True, max_length=255)
Run Code Online (Sandbox Code Playgroud)
我尝试了各种方法,例如在ModelAdmin中覆盖get_form()或使用ModelForm类并专门指定表单。
class SomeModelAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
form = super(self.__class__, self).get_form(request, obj, **kwargs)
form.slug.required = False
return form
Run Code Online (Sandbox Code Playgroud)
但是,这两种解决方案都不适合我。除了手动创建表单外,还有其他更快的解决方案吗?
我有很多这样的表格,而手工操作可能很繁琐且难以维护。
我想知道是否有可能以干净的方式在ModelAdmin中打印foreignkey链:
图像我们有这个结构:
class Ma(models.Model):
fa = models.EmailField()
class Mb(models.Model):
fb = models.ForeignKey('Ma')
class Mc(models.Model):
name = models.CharField(max_length=50)
fc = models.ForeignKey('Mb')
Run Code Online (Sandbox Code Playgroud)
现在使用ModelAdmin:
编辑:(这是无效的)
class McAdmin(admin.ModelAdmin):
list_display = ('name', 'fc__fb__fa',)
Run Code Online (Sandbox Code Playgroud)
或者我该如何解决这个问题?
Wagtail 是一款非常棒的 CMS。我确实有一个问题如何在管理中添加子菜单。我有一个自定义模型位置,在该模型中我有 2 个外键。管理通过 modeladmin 创建的位置模型菜单。然而,为了管理城市或外键内容,我还需要在 modeladmin 中创建。
我只在 modeladmin 中看到一个将项目添加到设置菜单的选项。我的管理员需要的是以下内容
+ pages
++ ...
+ locations
++ locations
++ cities
++ tags
+ ...
Run Code Online (Sandbox Code Playgroud)
目前我只能通过 menu_order=200 确定顺序
有没有办法让 wagtail 中的导航有子导航