自定义 django 管理视图

Posted

技术标签:

【中文标题】自定义 django 管理视图【英文标题】:custom django aministration view 【发布时间】:2014-06-23 13:38:27 【问题描述】:

我正在使用 django 管理视图。我有一个文章模型。每篇文章都有标题、正文、日期时间、标签和评级。默认情况下,django 会创建一个用于创建新文章的表单。 我只想要标题和正文的字段,但 django 为所有内容创建字段。我不想隐藏蛞蝓领域。如何隐藏或自定义管理员新文章视图?

这是我的model.py

from django.db import models
from django.core.urlresolvers import reverse

class Article(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(unique = True, max_length = 255)
    body = models.TextField()
    created = models.DateTimeField(auto_now_add = True)
    rating = 0

    class Meta:
        ordering = ['-created']
        exclude = ('rating')

    def __unicode__(self):
        return self.title


    def get_absolute_url(self):
        return reverse('article.views.article', args=[self.slug])

5 月 7 日更新: 我试图在我的 admin.py 中指定字段,为了让它工作,我必须为我的 slug 删除 prepopulated_fields。这导致一个没有蛞蝓的帖子。难道没有办法让一个没有字段的蛞蝓获得标题吗?

这是我原来的 admin.py。

from django.contrib import admin
from article.models import Article
# Register your models here.

class ArticleAdmin(admin.ModelAdmin):
    # fields display on change list
    list_display = ['title', 'body']
    # fields to filter the change list with
    list_filter = ['created',]
    # fields to search in change list
    search_fields = ['title', 'body']
    # enable the date drill down on change list
    date_hierarchy = 'created'
    # prepopulate the slug from the title - big timesaver!
    prepopulated_fields = "slug": ("title",)

admin.site.register(Article, ArticleAdmin)

【问题讨论】:

对于您的更新,您可以覆盖 Article 的保存方法以根据标题填充 slug,请查看:using slugify in save。 您真的应该将 Slug 问题移至新线程。 【参考方案1】:

您可以在ModelAdmin.fields 中列出您想要的字段,或者在ModelAdmin.exclude 中排除您不需要的字段。

例如,在一个名为 admin.py 的文件中:

from django.contrib import admin
from myproject.myapp.models import Article

class ArticleAdmin(admin.ModelAdmin):
    fields = ('title', 'body')
admin.site.register(Article, ArticleAdmin)

【讨论】:

【参考方案2】:

参考ModelAdmin docs,要从管理员视图中排除字段,在您的ArticleAdmin 类中,您可以像这样指定fieldsexclude 变量:

from django.contrib import admin

class ArticleAdmin(admin.ModelAdmin):
    fields = ('title', 'body')

# or equivalently, using exclude:
class ArticleAdmin(admin.ModelAdmin):
    exclude = ('slug', 'created', 'rating')

如果您还没有 ModelAdmin 类,请参阅 customizing the admin forms 上的 Django Tutorial。

【讨论】:

【参考方案3】:

在您的 admin.py 中,您应该能够排除您不想要的字段:

class ArticleAdmin(admin.ModelAdmin):
    exclude = ('slug',)
admin.site.register(Author, ArticleAdmin)

如果您希望该字段显示但不可编辑,您还可以在模型中将该字段设置为只读:

class Article(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(unique = True, max_length = 255)
    body = models.TextField()
    created = models.DateTimeField(auto_now_add = True, readonly=True)
    rating = 0

【讨论】:

以上是关于自定义 django 管理视图的主要内容,如果未能解决你的问题,请参考以下文章

Django 管理员,自定义视图错误:int() 以 10 为底的无效文字

Django 管理站点 change_list 视图自定义

python Django:向管理员更改列表视图添加自定义按钮

Django 自定义登录视图 -> 会话不持久

django 使用一个 url 运行自定义视图类方法

在管理界面上向 Django 内联对象添加自定义操作