Как передать значения из функции Django views в класс Django forms во время выполнения?

Мой шаблон Django:

{% extends 'main/base.html' %}
{%block title%}Delete List{%endblock%}

{%block content%}
    <form method="post" action="/delete/">
        {%csrf_token%}
        {{form}}
        <button type="sumbit" name="Delete List">Delete List</button>
    </form>
{%endblock%}

моя функция внутри представления:

def delete(response):
    if response.method=="POST":
        form1 = DeleteList(response.POST)
        print(f"delete button pressed: {form1.is_valid()}")#just checking
        if form1.is_valid():
            ""
            print("valid form: {}".format(form1.cleaned_data))#just checking
            return HttpResponseRedirect("/display")
    else:
        #form1 = DeleteList(10) -- iam trying to make this style work...and use a integer value from my database to set maxVaue of a field
        #Example: form1 = DeleteList(name="test",data2="somedata"...) -- i want this style to work cause I would pass more values to my forms class in future 
        form1 = DeleteList()
    return render(response,"main/deleteList.html",{"form":form1})

мой класс django forms:

class DeleteList(forms.Form):
    #i was trying to make this __init__ work but seems to be buggy
    """def __init__(self,maxValue:int, *args, **kwargs):
        super(DeleteList, self).__init__(*args, **kwargs)
        self.fields['id'] = forms.IntegerField(label="Enter id",min_value=1,max_value=maxValue)
    id = forms.IntegerField()"""    
    
    #below one is just static, iam trying to replace this with the above commented block of code
    id=forms.IntegerField(label="Enter id",min_value=1,max_value=10) #-- only this seems to work

Теперь, если сделать form1 = DeleteList(<int value here>) и получить его на __init__ класса forms, я могу получить значения в форму и установить мои IntegerField's max_value, кажется, что это работает только при первой загрузке формы, затем при отправке формы и при получении данных post в моей функции views(DeleteList): form1.is_valid() всегда false.

Итак, как мне установить мои формы IntegerField's max_value из моей функции представления django и все еще быть в состоянии получить мои данные метода post обратно в ту же функцию представления и иметь form1.is_valid() возвращенную ture для продолжения потока форм?

Вам нужно передать значение вниз как kwarg и удалить его перед отправкой вниз в класс Form Base. Следуйте примеру:

class DeleteList(forms.Form):
    def __init__(self, *args, **kwargs):
        caller = kwargs.pop('maxValue')
        # YOUR DESIRED LOGIC
        super(DeleteList, self).__init__(*args, **kwargs)

Я нашел рабочее решение, я просто добавил свой integer-i-want-to-use в метод post и все работает нормально

мой класс django forms это:

class DeleteList(forms.Form):
    def __init__(self,maxValue:int, *args, **kwargs):
        super(DeleteList, self).__init__(*args, **kwargs)
        self.fields['id'] = forms.IntegerField(label="Enter id",min_value=1,max_value=maxValue)
    id = forms.IntegerField()  

моя функция представления Django:

def delete(response):
    if response.method=="POST":
        form1 = DeleteList(10,response.POST)#early this was just form1 = DeleteList(response.POST)
        print(f"delete button pressed: {form1.is_valid()}")#just checking
        if form1.is_valid():
            ""
            print("valid form: {}".format(form1.cleaned_data))#just checking
            return HttpResponseRedirect("/display")
    else:
        form1 = DeleteList(10)
    return render(response,"main/deleteList.html",{"form":form1})

так что в POST это form1 = DeleteList(10,response.POST) кажется решает эту проблему для меня

это лучший способ передачи данных из функции view в класс forms?

Из того, что я могу прочитать в документации, она указывает на это: https://docs.djangoproject.com/en/4.0/ref/forms/api/#django.forms.Form.initial, но это, похоже, не работает для изменения IntegerField's max_value и это работает для изменения <any fields>'s value

Было бы здорово, если бы кто-нибудь смог прояснить, почему Form.initial (упомянутая в документации ссылка) не работает в моем случае и является ли метод, который я использую, единственным способом установить IntegerField's max_value ?

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