Попытка изменить поле внешнего ключа для одной модели в другой модели - PullRequest
0 голосов
/ 18 июня 2020

У меня есть две модели TextDocument и TranslatedText, как показано ниже. Я загружаю PDF-файл в другую модель (документ), и если в нем есть текст, выполняю распознавание текста и сохраняю текст OCR в поле original_text в TextDocument. Если текст не на английском языке sh, я перевожу его и сохраняю перевод в поле translated_text в TranslatedText. TranslatedText имеет отношение внешнего ключа к TextDocument.

class TextDocument(models.Model):
    document_id = models.ForeignKey(Document, on_delete=models.CASCADE,)
    original_text_file_name = models.FileField('OCR File name', upload_to=settings.DOCUMENT_FOLDER_OCR, default=settings.DEFAULT_OCR_PATH, storage=OverwriteStorage())
    original_text = models.TextField(default=get_default_text, blank=True)
    original_language = models.CharField(default=get_default_language, max_length=100)
    created = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="date created")
    updated = models.DateTimeField(auto_now=True, editable=False, verbose_name="last update")

class TranslatedText(models.Model):
    document_id = models.ForeignKey(Document, on_delete=models.CASCADE,)
    text_document_id = models.ForeignKey(TextDocument, on_delete=models.CASCADE,)
    translated_text_file_name = models.FileField('Translated File name', upload_to=settings.DOCUMENT_FOLDER_TRANSLATION, default=settings.DEFAULT_TRANSLATION_PATH, storage=OverwriteStorage())
    translated_text = models.TextField()
    translated_language = models.CharField(default=get_default_language, max_length=100)
    created = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="date created")
    updated = models.DateTimeField(auto_now=True, editable=False, verbose_name="last update")

На странице изменения TransaltedTextAdmin я отображаю поле translated_text в TextBox, чтобы его можно было редактировать при необходимости. Я также хочу отобразить поле TextDocument orignal_text как редактируемое поле, поэтому, если OCR испортилось, администратор может это изменить. Однако мне кажется, что я могу отображать только поле original_text как поле read_only и не могу его редактировать.

class TranslatedTextAdmin(admin.ModelAdmin):
    logger.debug("TranslatedTextDocumentAdmin START")
    list_display = ('get_document', 'get_document_id', 'get_document_state', 'translated_text_file_name', 'translated_language', 'updated', 'created', 'get_thumb',)
    #readonly_fields = ('get_original_document','updated', 'created','translated_language', 'translated_text_file_name', 'original_text',)
    readonly_fields = ('get_original_document','updated', 'created','translated_language', 'translated_text_file_name', )
    form = TranslatedTextAdminForm

    fieldsets = (
        (None, {
            'fields': ('translated_text', 'original_text', 'get_original_document', 'translated_text_file_name', 'translated_language', 'updated', 'created'),
            #'fields': ('translated_text', 'text_document_id__original_text', 'get_original_document', 'translated_text_file_name', 'translated_language', 'updated', 'created'),
            'classes': ('extrapretty',),
        }),
    )

  def get_translated_text(self, obj):
        return TranslatedText.objects.get_translation_metadata_text(obj.document_id) 

class TranslatedTextAdminForm(forms.ModelForm):

    original_text = forms.CharField()

    def __init__(self, *args, **kwargs):
        super(TranslatedTextAdminForm, self).__init__(*args, **kwargs)
        self.fields['original_text'] = forms.CharField(widget=AdminTextareaWidget(attrs={'cols': 40, 'rows': 10}), required=False)
        self.fields['original_text'].initial = TextDocument.objects.get_text_metadata_text(self.instance.document_id)           

    class Meta:
        model = TranslatedText
        fields = '__all__' 

Я пробовал использовать TranslatedTextAdminForm, как показано, но я могу получить только поле original_text отображать текстовое поле, которое нельзя редактировать. Что мне не хватает?

Спасибо!

Отметка

1 Ответ

0 голосов
/ 18 июня 2020

Думаю, у меня был момент Внешних Пределов. Кажется, мой код работал. Мне пришлось очистить кеш браузера, чтобы увидеть изменения. Теперь мы вернемся к нашей первоначально запланированной программе.

...