Есть ли способ отобразить данные из формы для вставки в базу данных без явного определения каждой переменной? - PullRequest
2 голосов
/ 20 июня 2019

Я сделал действительно длинную форму с помощью дуршлаговой алхимии и деформации.

Эта форма имеет около 100 полей, и в настоящее время я знаю, что единственный способ добавить данные обратно в базу данных после отправки формы - это явно переопределить каждую переменную, а затем добавить ее в базу данных, но должно быть лучше способ.


#my schema 

class All(colander.MappingSchema):
                setup_schema(None,atr)
                atrschema =atr.__colanderalchemy__
                setup_schema(None,chemicals)
                chemicalsschema =chemicals.__colanderalchemy__
                setup_schema(None,data_aquisition)
                data_aquisitionschema =data_aquisition.__colanderalchemy__
                setup_schema(None,depositor)
                depositorschema =depositor.__colanderalchemy__
                setup_schema(None,dried_film)
                dried_filmschema =dried_film.__colanderalchemy__

form = All()
form = deform.Form(form,buttons=('submit',))

# this is how I get it to work by redefining each field but there must be a better way

if 'submit' in request.POST:

   prism_material = request.params['prism_material']
   angle_of_incidence_degrees = 
   request.params['angle_of_incidence_degrees']
   number_of_reflections = request.params['number_of_reflections']
   prism_size_mm = request.params['prism_size_mm']
   spectrometer_ID = 6

   page = atr (spectrometer_ID=spectrometer_ID,prism_size_mm=prism_size_mm,number_of_reflections=number_of_reflections,angle_of_incidence_degrees=angle_of_incidence_degrees,prism_material=prism_material)

   request.dbsession.add(page)




Would like to somehow just be able to remap all of that 'multi dictionary' that is returned back to the database?

1 Ответ

2 голосов
/ 21 июня 2019

Итак, у вас есть dict (request.params) и вы хотите передать парс значения ключа из этого dict в функцию? В Python есть способ сделать это, используя **kwargs синтаксис :

if 'submit' in request.POST:
   page = Page(spectrometer_ID=6,**request.params)   
   request.dbsession.add(page)

(это работает также потому, что SQLAlchemy предоставляет конструктор по умолчанию, который присваивает переданные значения сопоставленным столбцам, нет необходимости определять его вручную)

Конечно, это наивный подход, который будет работать только для простейших вариантов использования - например, он может разрешить передачу параметров, не определенных в вашей схеме, что может создать проблему безопасности; имена полей в вашей схеме должны совпадать с именами полей в вашей модели SQLAlchemy; он может не работать со списками (то есть несколькими значениями с одним и тем же именем, к которым вы можете получить доступ через request.params.get_all (name)).

...