0

我正在尝试拥有一个可在管理员中单击但也是只读的 FileField。目前有一个针对此问题的公开,但我现在需要一个解决方法。我正在尝试为我的管理类编写一个验证器,但是当我运行它时遇到了异常。这是我目前拥有的:

class ModelWithAttachment(models.Model):
    attachment = FileField(upload_to=somewhere, blank=True)

class ModelWithAttachmentAdminForm(forms.ModelForm):
    class Meta:
        model = ModelWithAttachment

    def clean_attachment(self):
        attachment = self.cleaned_data['attachment']
        return self.cleaned_data['attachment']

class ModelWithAttachmentAdmin(admin.ModelAdmin):
    form = ModelWithAttachmentAdminForm

目前我得到一个 AssertionError 没有在该行提供异常attachment = self.cleaned_data['attachment']。如果我用 替换该行cleaned_data = self.cleaned_data,我会得到相同的 AssertionError。据我了解, self.cleaned_data 应该是在验证过程的早期创建的,所以我不明白为什么它似乎不存在。

其次,我对整个方案的目标是检查通过管理员提交的附件的值与它当前持有的值,如果两者不同,则拒绝它(引发 ValidationError) - 本质上使附件为“只读”,同时​​允许在管理员中点击它。这是一个可行的目标吗?是否有另一种更好/更简单的方法来实现这一点?

4

1 回答 1

0

我想到了。我的方法是正确的,clean_attachment被定义为:

def clean_attachment(self): 
    if 'attachment' in self.changed_data: 
        raise forms.ValidationError('no!') 

    return self.cleaned_data['attachment'] 

问题是旧的 .pyc 文件被错误地重用。一旦我删除它,它就很好。希望能帮助别人。

于 2011-07-22T03:25:55.903 回答