[英]Django admin - make all fields readonly
I'm trying to make all fields readonly without listing them explicitly.我试图将所有字段设为只读而不明确列出它们。
Something like:就像是:
class CustomAdmin(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None):
if request.user.is_superuser:
return self.readonly_fields
return self.fields
The problem is CustomAdmin.fields
is not set at this point.问题是此时未设置
CustomAdmin.fields
。
Any ideas?有任何想法吗?
Careful, self.model._meta.fields are not necessarily the same fields that CustomAdmin has!小心,self.model._meta.fields 不一定是 CustomAdmin 拥有的字段!
"All fields of the Admin" would look more like this: “管理员的所有字段”看起来更像这样:
from django.contrib import admin
from django.contrib.admin.utils import flatten_fieldsets
class CustomAdmin(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None):
if request.user.is_superuser:
return self.readonly_fields
if self.declared_fieldsets:
return flatten_fieldsets(self.declared_fieldsets)
else:
return list(set(
[field.name for field in self.opts.local_fields] +
[field.name for field in self.opts.local_many_to_many]
))
Since django 2.1, you can prevent editing, while allowing viewing, by returning False
from the ModelAdmin
's has_change_permission
method, like this:从 django 2.1 开始,您可以通过从
ModelAdmin
的has_change_permission
方法返回False
来阻止编辑,同时允许查看,如下所示:
class CustomAdmin(admin.ModelAdmin):
def has_change_permission(self, request, obj=None):
return False
(This will not work before django 2.1, as it will also deny permission to any user trying only to view.) (这在 django 2.1 之前不起作用,因为它也会拒绝任何仅尝试查看的用户的权限。)
Ok, now there's this:好的,现在有这个:
class CustomAdmin(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None):
# ...
return [f.name for f in self.model._meta.fields]
Still looking for a less ugly way.仍在寻找一种不那么丑陋的方式。
You could iterate through the model meta fields:您可以遍历模型元字段:
def get_readonly_fields(self, request, obj=None):
if obj:
self.readonly_fields = [field.name for field in obj.__class__._meta.fields]
return self.readonly_fields
For Inlines (Tab or Stack)对于内联(选项卡或堆栈)
def get_readonly_fields(self, request, obj=None):
fields = []
for field in self.model._meta.get_all_field_names():
if field != 'id':
fields.append(field)
return fields
def has_add_permission(self, request):
return False
This worked for me with Django 1.10这在 Django 1.10 中对我有用
def get_readonly_fields(self, request, obj=None):
if request.user.is_superuser:
return self.readonly_fields
return list(set(
[field.name for field in self.opts.local_fields] +
[field.name for field in self.opts.local_many_to_many]
))
If someone still lookign for better way, you can use it like this:如果有人仍然在寻找更好的方法,您可以像这样使用它:
@admin.register(ClassName)
class ClassNameAdmin(admin.ModelAdmin):
readonly_fields = [field.name for field in ClassName._meta.fields]
ClassName is your Model class. ClassName 是您的模型类。
My requirement was similar .我的要求是相似的。 I needed only one field to be shown as read-only .
我只需要一个字段显示为 read-only 。 And this worked fine:
这工作正常:
class ChoiceInline(admin.TabularInline):
model = Choice
extra = 1
fields = ['choice_text', 'votes']
readonly_fields = ['votes']
class QuestionAdmin(admin.ModelAdmin):
#fields = ['pub_date', 'question_text']
fieldsets = [
(None, {'fields': ['question_text']}),
('Date Information', {'fields': ['pub_date']}),
]
search_fields = ['question_text']
inlines = [ChoiceInline]
Refer : C:\\Python27\\Lib\\site-packages\\django\\contrib\\admin\\options.py参考:C:\\Python27\\Lib\\site-packages\\django\\contrib\\admin\\options.py
Say you have defined user_mode as;假设您已将 user_mode 定义为;
Admin, Customers and Staff
If you'd like to deny a staff (and of course, customers) the privilege of deleting a customer, product, order etc...如果您想拒绝员工(当然还有客户)删除客户、产品、订单等的特权...
Your code goes;你的代码去;
def get_readonly_fields(self, request: HttpRequest, obj=None):
if request.user.user_mode != "Admin":
return self.readonly_fields + ['user_mode']
return super().get_readonly_fields(request, obj)
where user_mode = a model field holding the type of user.其中 user_mode = 保存用户类型的模型字段。
NB: my code uses "Pylance" (like typescript in JS)注意:我的代码使用“Pylance”(就像 JS 中的打字稿)
With get_fieldsets you get all fields from the form使用 get_fieldsets 您可以从表单中获取所有字段
def get_readonly_fields(self, request, obj=None):
readonly = []
for fs in self.get_fieldsets(request, obj):
if len(fs) > 1:
readonly += fs[1].get('fields', [])
return readonly
@admin.register(Hero)
class HeroAdmin(admin.ModelAdmin, ExportCsvMixin):
...
readonly_fields = ["father", "mother", "spouse"]
reference : https://books.agiliq.com/projects/django-admin-cookbook/en/latest/changeview_readonly.html参考: https : //books.agiliq.com/projects/django-admin-cookbook/en/latest/changeview_readonly.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.