Как передать значения из функции 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
?