按用户限制django-admin上的django-choice字段



我有一个这样的考试:

class Exam(BaseModel):
...
STATE_CHOICES = (
(PASS, PASS),
(FAILED, FAILED),
(GREAT, GREAT),
state = models.CharField(max_length=15, choices=STATE_CHOICES, default=PASS)
...

在Django管理中,我希望X组的用户只能将状态从FAILED更改为PASS。并且具有组Y的用户能够将状态从FAILED改变为PASS并且PASS改变为GREAT。这是我的管理员.py:

@admin.register(Exam)
class ExamAdmin(NestedModelAdmin):
list_display = ('state',)

有人知道解决办法吗?

这可能会起作用;

class AdminExamForm(forms.ModelForm):
...
options
...
class ExamForm(forms.ModelForm):
...
STATE_CHOICES = (
(PASS, PASS),
(FAILED, FAILED),
(GREAT, GREAT),
state = forms.CharField(choices=STATE_CHOICES)
class Meta:
model = Exam
fields = ('state',)
...
@admin.register(Exam)
class ExamModelAdmin(admin.ModelAdmin):
...
fields = ('state',)
list_display = ('state',)
form = ExamForm
...
def get_form(self, request, obj=None, **kwargs):
if request.user.is_admin or request.user.is_superuser:
return AdminExamForm
else:
return ExamForm
很抱歉之前给你举了一个不好的例子,没有太多时间

这就是您访问用户的方式,如果您的考试模型有一个

from django.contrib.auth import get_user_model
class Exam(BaseModel):
...
STATE_CHOICES = (
(PASS, PASS),
(FAILED, FAILED),
(GREAT, GREAT),
state = models.CharField(max_length=15, choices=STATE_CHOICES, default=PASS)
user = models.ForeignKey(get_user_model(), on_delete=models.RESTRICT)
...
def save(self, *args, **kwargs):
if self.user.is_admin or self.user.is_superuser:
... your logic here
super(Exam,self).save(*args,**kwargs)

要在创建/保存方法中访问请求,请执行以下操作:

  • 将其传递到所需形式的create/save方法的kwargs中
  • 然后在create/save方法中获取请求,并执行逻辑
request = kwargs.get('request',None)

编辑,将请求获取到模型的.save()

Django管理员的保存模型函数实际上只是调用obj.save()因此,如果您将request=request传递到类似这样的保存中:

def save_model(self, request, obj, form, change):
"""
Given a model instance save it to the database.
"""
obj.save(request=request)

它应该起作用。

覆盖管理员保存:

重写Django Admin 的保存方法

最新更新