J'ai un objet django complexe, qui a des propriétés d'autres types de classe. Cela se présente comme suit:ID de base de données de formulaire et d'objets Django
class Order:
contractor - type Person
some other fields....
Dans ma forme, je voudrais être en mesure de choisir soit l'objet Personne existante dans la liste déroulante ou ajouter une nouvelle avec un formulaire. J'ai réussi à créer des formulaires et un flux de travail approprié, mais le problème consiste à enregistrer l'ordre lui-même, je ne peux tout simplement pas obtenir l'identifiant d'une instance Person enregistrée. Je fais qqch comme ceci:
def make_order(request):
if request.method == 'POST':
parameters = copy.copy(request.POST)
contractor_form = ContractorForm(parameters)
if contractor_form.is_valid():
contractor_form.save()
parameters['contractor'] = ???
form = OrderForm(parameters)
if form.is_valid():
form.save()
return HttpResponseRedirect('/orders/')
else:
form = OrderForm()
contractor_form = ContractorForm()
return render_to_response('orders/make_order.html', {'order_form' : form, 'contractor_form' : contractor_form})
Ainsi, si la demande POST atteint cette méthode j'ai vérifier si ContractorForm ont été remplies - Je suppose que si la forme est valide, il est destiné à être utilisé. Si oui, que je l'enregistre et que je souhaite assigner l'identifiant de la base de données de l'objet sauvegardé au champ approprié pour que OrderForm le trouve.
Tous mes formulaires sont ModelForms.
Les questions sont les suivantes:
- Y at-il de meilleures façons de le faire? (choisir parmi une liste déroulante ou ajouter en place) - mieux ou plus pythonique ;-)
- Comment puis-je obtenir des ID d'objets enregistrés lors de l'utilisation ModelForms?
Edité
Mon ContractorForm est:
class ContractorForm(ModelForm):
class Meta:
model = Contractor
Rien de fantaisie.
Sur une note de côté, inverse l'utilisation (http://docs.djangoproject.com/fr/dev/topics/http/urls/# reverse) au lieu de référencer l'URL '/ orders /' directement dans votre 'HttpResponseRedirect' ... cela vous évitera des tonnes de maux de tête s dans le futur, croyez-moi :) – sdolan
Ha! Vous avez raison, j'aurais dû le faire plus tôt. –