Как показать пользователю ошибку при инициализации формы 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. Возможно, это имеет значение?
Обновите класс формы следующим образом:
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()
Обновите ваше представление следующим образом:
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})
Обновите ваш шаблон следующим образом:
{% if error_message %} {{ error_message }}
{% else %} {% csrf_token %} {{ form.as_p }} Отправить {% endif %}