Форма Django не проходит валидацию
У меня есть форма, которой я передаю параметр для отключения или включения полей на основе нажатия пользователем определенной гиперссылки.
URL
path("update-request/<str:pk>/", update_request, name="update_request"),
path("update-request/<str:pk>/<str:action>", update_request, name="update_request"),
views.py
def create_new_request(request, action=None):
description_form = DescriptionForm(action=action)
forms.py
class DescriptionForm(forms.ModelForm):
prefix = "description"
....
def __init__(self, action=None, *args, **kwargs):
super(DescriptionForm, self).__init__(*args, **kwargs)
print(action)
пример гиперссылки: Новый запрос
Моя проблема начинается, когда я хочу сохранить данные в базу данных, я получаю все поля отображаются как обязательные, даже если в них есть данные. удаление action
из DescriptionForm.init останавливает проблему, как мне обойти эту проблему? Причина, по которой мне понадобилось добавить action
в init, заключается в том, что мне нужно включить или отключить поля, если выполняется условие.
def __init__(self, action=None, *args, **kwargs):
super(DescriptionForm, self).__init__(*args, **kwargs)
if action == "new_request" or "review":
for field in self.fields:
self.fields[field].disabled=True
Мои ошибки выглядят следующим образом: title
This field is required.
category
This field is required.
job_description
This field is required.
urgent_request
This field is required.
detailed_job_description
This field is required.
Я думаю, что вы можете передать instance объекта через форму, чтобы решить эту проблему. Например, так:
def create_new_request(request, pk, action=None):
description = Description.objects.get(pk=pk)
description_form = DescriptionForm(action, instance=description)
И также обновите форму:
def __init__(self, action=None, *args, **kwargs):
super(DescriptionForm, self).__init__(*args, **kwargs)
if action in ["new_request","review"] and self.instance:
# rest of the code
Даже если поле отключено, это не значит, что для него не нужны данные. Если вы не можете предоставить данные, то лучше удалить такие поля, как:
for field in self.fields:
del self.fields[field]
Или предоставить фиктивные данные для проверки.