如何使用验证在管理员中创建可点击的伪读取FileField?

时间:2011-07-21 19:21:07

标签: python django readonly filefield

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

    return self.cleaned_data['attachment'] 

问题是旧的.pyc文件被错误地重用。删除后,一切都很好。希望能帮助其他人。