python - How to pass argument name as a parameter? -


i have code:

hobbies2 = form.cleaned_data.pop('hobbies2') personnehobby.objects.filter(personne=obj).delete() pk_str in hobbies2:     try:         hobby = tagtraduit.objects.get(pk=int(pk_str))         p = personnehobby.objects.create(personne=obj,                                          hobby=hobby)         p.save()     except valueerror:         break  # hack in post     except lookuperror:         break  # hack in post 

i have same code 4 different fields, exemple programme:

programmes2 = form.cleaned_data.pop('programmes2') personneprogramme.objects.filter(personne=obj).delete() pk_str in programmes2:     try:         programme2 = tagtraduit.objects.get(pk=int(pk_str))         p = personneprogramme.objects.create(personne=obj,                                              programme=programme2)         p.save()     except valueerror:         break  # hack = tout stopper     except lookuperror:         break  # hack = tout stopper 

exactly same code, name of field change. i'd make generic function , call this:

def update_field(post_field, class_field, **kwargs):     try:         values = form.cleaned_data.pop(post_field)         class_field.objects.filter(personne=obj).delete()         pk_str in values:             try:                 v = tagtraduit.objects.get(pk=int(pk_str))                 p = class_field.objects.create(**{'personne': obj,                                                   field_name: v})                 p.save()             except valueerror:                 break  # hack = tout stopper             except lookuperror:                 break  # hack = tout stopper     except keyerror:         pass update_field('programmes2', personneprogramme, 'programme') update_field('hobbies2', personnehobby, 'hobby') 

my main problem last parameter, name of field use when creating record in database.

how it?

you arbitary number of keyword-arguments (**) , insert calculated additional parameters inside function:

def update_field(field, update_this, **kwargs):      ...      kwargs[update_this] = tagtraduit.objects.get(pk=int(pk_str))      p = field.objects.create(**kwargs)      ... 

this allows call that:

update_field(personnehobby, 'hobby', personne=obj) update_field(personneprogramme, 'programme', personne=obj) 

Comments