Отправка дополнительных данных для инициализации формы

Итак, я создаю объект формы, используя данные request.POST, но хочу инициализировать дополнительные поля, используя другие значения. Вот что я пробовал, но это не работает:

#forms.py

class InputForm3(forms.Form):
    url = forms.URLField(required=True)
    db = forms.CharField(required=False)
    wks = forms.CharField(required=True, initial="Sheet1")
    table = forms.CharField(required=False, initial="test_table")

def __init__(self, wks, *args, **kwargs):
        self.wks=wks
        super().__init__(*args, **kwargs)
        self.cleaned_data = None

def clean(self):
        self.cleaned_data = super().clean()
        print("FORM3 cleaned_data : ", self.cleaned_data)

#views.py

form3=InputForm3(wks="Sheet1", data= request.POST)
if form3.is_valid:
    #remaining code

#output

FORM3 cleaned_data :  {'url': 'https://randomurl.com', 'db': 'testdb', 'table': ''}

поля 'url' и 'db' присутствуют непосредственно в request.POST, КАК ИНИЦИАЛИЗИРОВАТЬ ДРУГИЕ ПОЛЯ, ПОМОГИТЕ!

Не уверен в контексте того, почему вы хотите это сделать.

Но, возможно, вы можете попробовать скопировать data формы после того, как вы инициализировали форму с помощью request.POST data. У вас будет доступ к изменению скопированного data. Например:

Если вы используете function-based view:

def view_name(request):
     form3 = InputForm3(request.POST)

     if request.method == "POST":
          form3 = InputForm3(data=request.POST) # removing wks from the parameter here...

          # assigning the copied collection of data to the form's data so we can modify it
          form3.data = form3.data.copy()
          form3.data['wks'] = 'Sheet1' # or whatever name you wish to name that wk

          if form3.is_valid():
               # remaining code
          ...

Если вы используете class-based view:

def post(self, request, *args, **kwargs):
     form3 = InputForm3(data=request.POST)

     form3.data = form3.data.copy()
     form3.data['wks'] = 'Sheet1'

     if form3.is_valid():
          # remaining code
     ...

Это сработало для меня.

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