首页 > 解决方案 > Django 管理面板、关系和只读字段

问题描述

我在 model.py 中有一个非常简单的方案

class Attachment(models.Model):
    name = models.CharField(max_length=100,
                            verbose_name='name')
    file = models.FileField(upload_to=settings.MEDIA_ROOT,
                            null=True,
                            verbose_name='file')
    def __str__(self):
        return self.name

class Document(models.Model):
    title = models.CharField(max_length=250, blank=False)
    attachment = models.ForeignKey('Attachment', null=True, on_delete=models.CASCADE)
    date = models.DateField(blank=True)
    approved = models.BooleanField(default=False)

    def __str__(self):
        return self.title

还有我的 admin.py

class DocumentAdmin(admin.ModelAdmin):
    fieldsets = (
        ('GENERAL', {
            'fields': ('title', 'attachment', 'date',  'approved')
        }),
    )
admin.site.register(Document, DocumentAdmin)

我正在努力解决两个问题:


首先,我想在 DocumentAdmin 界面中包含附件的字段。我在 Document 模型中创建了一个 get 方法。

def get_attachment_file(self):
    return self.attachment.file

方法 get_attachment_file 在 list_display 中有效,但在 fieldset 中无效

list_display = ('get_attachment_file',)

另外,在“批准”设置为“真”之后,我想让“批准”和“日期”字段只读。

谢谢你们。

标签: pythondjango

解决方案


您应该能够添加 get_attachment_file 并使其成为只读字段。要在批准设置为 True 后使批准和日期只读,您可以使用 get_readonly_fields 方法

def get_readonly_fields(self, request, obj=None):
    readonly_fields = ('get_attachment_file',)
    if obj and obj.approved:
        readonly_fields += ('approved', 'date')
    return readonly_fields

推荐阅读