Форма 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]

Или предоставить фиктивные данные для проверки.

Вернуться на верх