Как показать пользователю ошибку при инициализации формы Django?

Я пытаюсь сделать следующее. Форма должна загружать текстовый файл. Если он отсутствует, форма не должна загружаться. Вместо этого должна появиться ошибка.

class SemanticAiForm(forms.Form):
    semantic_folder = configurate.AI_DATA_FOLDER
    semantic_files = 'ai_openai_fresh_news.txt'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        semantic = self.get_semantic()
        if semantic is None:
            self.add_error(NON_FIELD_ERRORS, 'No data')
        else:
            self.fields['order'] = forms.CharField(widget=forms.Textarea())
            self.fields['order'].initial = semantic.system_content

    def get_semantic(self) -> Union[SemanticTxt, None]:
        """
        Получает объект SemanticTxt с прочитанным файлом параметрической
        конфигурации.
        """

        try:
            filepath = os.path.join(self.semantic_folder, self.semantic_files)
            semantic = read_semantic(filepath)

        except exception.SemanticError:
            return

        return semantic

Если файл есть, то все в порядке. Если файла нет, то наоборот. Django сообщает:

'SemanticAiForm' object has no attribute 'cleaned_data'

Я пытаюсь сделать что-то другое. Если файла нет, вывести ошибку в шаблоне. И не показывать форму. Что я делаю не так?

ОБНОВИТЬ

class RustpdAdminSite(admin.AdminSite):
"""
Переопределение админ-части создаёт пространство для творчества.
"""

def get_urls(self):
    urls = super().get_urls()

    custom_urls = [
        path('semantic-ai/',
             self.admin_view(views_admin.SemanticAiGPT.as_view(
                 admin_context=self.each_context)
             ),
             name='semantic'),
    ]

    return custom_urls + urls

Функция просмотра вызывается через views_admin. Возможно, это имеет значение?

  1. Обновите класс формы следующим образом:

    class SemanticAiForm(forms.Form): semantic_folder = configurate.AI_DATA_FOLDER semantic_files = 'ai_openai_fresh_news.txt'

     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
         self.is_valid_file = True
    
         semantic = self.get_semantic()
         if semantic is None:
             self.is_valid_file = False
         else:
             self.fields['order'] = forms.CharField(widget=forms.Textarea())
             self.fields['order'].initial = semantic.system_content
    
     def get_semantic(self) -> Union[SemanticTxt, None]:
         try:
             filepath = os.path.join(self.semantic_folder, self.semantic_files)
             semantic = read_semantic(filepath)
         except exception.SemanticError:
             return None
         return semantic
    
     def is_bound(self):
         return super().is_bound() and self.is_valid_file
    
     def is_valid(self):
         if not self.is_valid_file:
             return False
         return super().is_valid()
    
  2. Обновите ваше представление следующим образом:

    def your_view(request): form = SemanticAiForm() if form.is_valid_file: if request.method == 'POST': form = SemanticAiForm(request.POST) if form.is_valid(): # Ваш код обработки формы передать else: error_message = "Файл не найден или не может быть прочитан." return render(request, 'your_template.html', {'error_message': error_message})

     return render(request, 'your_template.html', {'form': form})
    
  3. Обновите ваш шаблон следующим образом:

    {% if error_message %} {{ error_message }}

    {% else %} {% csrf_token %} {{ form.as_p }} Отправить {% endif %}
Вернуться на верх