Как использовать проверку, чтобы сделать кликабельный, псевдо-только для чтения FileField в администраторе? - PullRequest
0 голосов
/ 21 июля 2011

Я пытаюсь создать 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), если они различаются - по сути, сделать вложение «только для чтения», позволяя щелкнуть его в администраторе.,Это достижимая цель?Есть ли другой лучший / более простой способ сделать это?

1 Ответ

0 голосов
/ 22 июля 2011

Я понял это.Мой подход был правильным, с clean_attachment, определяемым как:

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

    return self.cleaned_data['attachment'] 

Проблема была в том, что старый файл .pyc повторно использовался неправильно.Как только я удалил это, все было в порядке.Надеюсь, что это поможет кому-то еще.

...