【问题标题】:How to hide or disable 'slug' field in django admin?如何在 django admin 中隐藏或禁用“slug”字段?
【发布时间】:2014-05-03 18:34:15
【问题描述】:

我想禁用(首选)或隐藏 django 管理页面中的“slug”字段。我从 django 源代码“prepopulated_fields crashes with get_readonly_fields”中发现了错误,但实际上并没有解决问题。

我正在使用 django 1.5.5

示例基本情况:

models.py

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=140, unique=True)
    slug = models.SlugField(max_length=140, unique=True)
...

admin.py

from django.contrib import admin
from blog.models import Post

class PostAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('title',)}
    readonly_fields = ('slug',)
...

异常

KeyError at /admin/blog/post/2/
u"Key 'slug' not found in Form"

  Request Method:   GET
  Request URL:      http://127.0.0.1:8000/admin/blog/post/2/
  Django Version:   1.5.5
  Exception Type:   KeyError
  Exception Value:  u"Key 'slug' not found in Form"
  Exception Location:   /home/XXXXXX/django_projects/virtualenvs/myenv27/local/lib/python2.7/site-packages/django/forms/forms.py in __getitem__, line 111
  Python Executable:    /home/XXXXXX/django_projects/virtualenvs/myenv27/bin/python
  Python Version:   2.7.3

这可能是一个非常简单的问题,但我找不到有效的解决方案。也许有人知道这个问题的好解决方案。

谢谢。

【问题讨论】:

  • 在编辑时是否要将其设为只读?
  • 是的,我想在 django admin 中编辑帖子时关闭 slug 字段。

标签: django python-2.7 django-models django-admin


【解决方案1】:

未测试,但应该接近:

class PostAdmin(admin.ModelAdmin):
    ...


    def __init__(self, *args, **kwargs):
        super(PostAdmin, self).__init__(*args, **kwargs)

        if not self.instance:
            self.prepopulated_fields = {'slug': ('title',)}


    def get_readonly_fields(self, request, obj=None):
        fields = []
        if obj:
            fields += ['slug']

        return fields

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2011-02-10
    • 2011-10-08
    • 2012-05-07
    • 2016-05-31
    • 2011-09-28
    • 2018-02-17
    • 2019-09-17
    • 2010-11-27
    相关资源
    最近更新 更多