【问题标题】:Django Admin add/change disable a field based on previews field choiceDjango Admin添加/更改基于预览字段选择禁用字段
【发布时间】:2020-05-02 11:23:02
【问题描述】:

在我的 django 管理项目中,我有这个模型:

class m_pcontent(models.Model):
    MY_CHOICES = (
        ('T', 'Text'),
        ('I', 'Image'),
    )

    p_id = models.ForeignKey(m_pages, on_delete=models.CASCADE)
    p_type = models.CharField(max_length=1, choices=MY_CHOICES)
    p_content = models.TextField(null=True, blank=True)
    p_images = models.ForeignKey(m_pimg, on_delete=models.CASCADE, null=True, blank=True)
    ...

在我的 admin.py 中

class m_pcontentAdmin(admin.ModelAdmin):
    list_display = ('p_id', 'p_type', 'p_lang', 'p_dload', 'p_active')
    list_filter = ('p_id', 'p_type', 'p_lang')
    ordering = ('p_id', 'p_type')
    readonly_fields = [...]

我会根据添加/更改区域中 p_type 字段中的用户选择动态地将 p_content 字段或 p_images 字段设为只读(如果选择 Text p_images 必须变为只读,否则如果选择 Image p_content 必须变为只读)

有人可以帮助我吗?

提前非常感谢

【问题讨论】:

    标签: django python-3.x django-models django-admin


    【解决方案1】:
    # You have to write get_readonly_fields in your admin class
    
    def get_readonly_fields(self, request, obj=None):
        if obj:
            if obj.p_type=='T': # if user select 'T' for Text
                self.readonly_fields + ['p_images',]
            elif obj.p_type=='I': # if user select 'I' for Image
                self.readonly_fields + ['p_content',]
    

    【讨论】:

    • 嗨,谢谢我有这个错误:'NoneType'对象没有属性'p_type'
    • obj 在对象创建期间为 None,但在编辑期间设置为正在编辑的对象。因此,如果 obj 存在,则需要设置一个条件。我还编辑了我的答案。
    • 嗨,谢谢,我试过但得到:'NoneType' 对象不可迭代
    猜你喜欢
    • 2018-03-05
    • 2016-06-05
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多