简体   繁体   English

Django Admin更改列表隐藏用户的选择选项之一

[英]Django Admin change list Hide one of the choices option for users

I have a model with an integer field.我有一个带有整数字段的模型。 This field has choices option.该字段有选择选项。 As you can see Request has 4 available statuses.如您所见,Request 有 4 个可用状态。 I want to display only three of them on the edit template and celery task will change status from 3 to 4th state every 12 hours.我只想在编辑模板上显示其中三个,芹菜任务将每 12 小时从第 3 个状态更改为第 4 个状态。 So when a user in the admin panel can change the status only to 1, 2 or third status but not to 4th one.因此,当管理面板中的用户只能将状态更改为 1、2 或第三个状态但不能更改为第 4 个状态时。

Model code型号代码

    UNPROVEN = 1
    IN_PROGRESS = 2
    IN_LINE_FOR_DELETE = 3
    DELETED = 4

    _STATUS = [
        (UNPROVEN, "Unproven"),
        (IN_PROGRESS, "In progress"),
        (IN_LINE_FOR_DELETE, "In line for deletion"),
        (DELETED, "Deleted")
    ]

    delete_user = models.ForeignKey('BoosteroidUser',
                                    on_delete=models.SET(get_deleted_user),
                                    related_name='%(class)s_delete')
    delete_reason = models.TextField(max_length=1024)
    status = models.IntegerField(default=1,
                                 choices=_STATUS,
                                 blank=False)
    responsible_user = models.ForeignKey('BoosteroidUser',
                                         on_delete=models.SET(get_deleted_user),
                                         null=True, blank=True,
                                         default=None)```


Code from admin
```@admin.register(UserDeleteRequest)
class UserDeleteRequest(admin.ModelAdmin):

    list_display = ("status", "responsible_user")
    fields = ("delete_user", "status", "responsible_user", "delete_reason")
    readonly_fields = ("responsible_user", "delete_user", "delete_reason")

    def has_add_permission(self, request):
        return False

    def has_delete_permission(self, request, obj=None):
        return False

    def save_model(self, request, obj, form, change):
        if obj.status == 3 or 2:
            obj.responsible_user = request.user
        super().save_model(request, obj, form, change)```

So I expected that any user in the admin panel will be able to see and choose only first 3 statuses but not the 4th one
[Expected result][1]


  [1]: https://i.stack.imgur.com/ICJ0i.png

You should look into django-fsm! 您应该研究django-fsm! ( https://github.com/viewflow/django-fsm ) https://github.com/viewflow/django-fsm

You can create a custom form ( UserDeleteRequestForm ) and override status field 您可以创建一个自定义表单( UserDeleteRequestForm )并覆盖status字段

from django.forms import ModelForm, ChoiceField


class UserDeleteRequestForm(ModelForm):
    class Meta:
        model = UserDeleteRequest
        fields = '__all__'

    status = ChoiceField(
        choices=[
            (UserDeleteRequest.UNPROVEN, "Unproven"), 
            (UserDeleteRequest.IN_PROGRESS, "In progress"),
            (UserDeleteRequest.IN_LINE_FOR_DELETE, "In line for deletion"),
        ]
    )

Then use it in your ModelAdmin: 然后在您的ModelAdmin中使用它:


@admin.register(UserDeleteRequest)
class UserDeleteRequestAdmin(admin.ModelAdmin):
    form = UserDeleteRequestForm
    ...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM