2013-10-10 2 views
0

Le document Django mentionne qu'un objet AutoField de modèle ne sera pas représenté sous une forme créée avec ModelForm.Comment utiliser Django AutoField pour éditer un modelForm?

Lors de la modification et de l'enregistrement de ce formulaire, comment devrais-je connaître la valeur de l'ID AutoField sous-jacent pour enregistrer correctement mes données de formulaire dans la base de données?

Je sais que je peux m'injecter dans le formulaire d'édition un champ caché pour savoir quelle ligne a été éditée mais y a-t-il un moyen pour Django de gérer ce champ caché ou un autre mécanisme automatiquement?

Merci beaucoup

Etienne

Répondre

3

Vous faites cela en spécifiant le paramètre instance=<> lorsque vous utilisez ModelForm. Plus à ce sujet dans le documentation here

Exemple d'utilisation d'une vue de créer/mise à jour:

def myview(request, id=None): 
    if id: 
     obj_to_edit = MyModel.objects.get(id=1) 
     form = MyForm(instance=obj_to_edit) 
    else: 
     obj_to_edit = None 
     form = MyForm() 

    if request.method == 'POST': 
     if id: #update 
      form = MyForm(request.POST, instance=obj_to_edit) 
     else: #create 
      form = MyForm(request.POST) 

    #rest of the code 

et l'URL aurait quelque chose comme:

url(r'/blah/create/', 'myview'), 
url(r'/blah/edit/(?P<id>[\d+])/', 'myview') 

Maintenant, django comprend qu'il doit modifier plutôt que de créer de nouveaux objets.

Notez également que si vous utilisez forms.Form, vous devrez manuellement interroger les champs uniques, ou injecter le champ caché id comme vous l'avez mentionné.

+0

Je suis au courant du paramètre d'instance, mais comment voulez-vous obtenir votre id = 1 si elle ne vient pas à la demande? C'est exactement la question que j'ai –

+0

Vous initialisez l'instance d'un objet à éditer. Vous avez déjà accès à cela d'une manière ou d'une autre? Mon exemple suppose simplement que vous l'avez, mais vous pouvez le passer comme paramètre d'URL et y accéder dans la vue. Juste édité la réponse. J'espère que cela fait un peu plus de sens. – karthikr

+0

Ok, mais je suis curieux de savoir s'il existe un moyen facile de faire en sorte que l'AutoField soit géré de la même manière que les autres champs (cachés ou non) et ne pas avoir à le gérer dans l'URL comme vous l'avez fait? –

2

Habituellement lorsque vous modifiez une forme l'instance spécifique que vous souhaitez modifier sera identifié dans votre URL en utilisant soit la clé primaire ou d'un champ slug, par exemple:

www.example.com/model/edit/6/ 

ou

www.example.com/model/edit/object_slug/ 

alors vous mettre en place votre urls.py pour passer ce paramètre à votre point de vue, où vous utilisez l'exemple fourni par karthkir (je vais utiliser le primaire comme l'exemple d'ici)

urls.py

urlpatterns = patterns('', 
    url(regex=r'^model/edit/(?P<pk>\d+)/$', 'myapp.views.myview', name='add_customer'), 
) 

views.py

def myview(request, pk): 
    obj_to_edit = MyModel.objects.get(id=pk) 
    ... 
+0

le cas du formset, dans lequel la clé primaire serait généralement spécifiée dans le formulaire lui-même. –

+0

@LieRyan: vrai, mais l'OP ne mentionne pas l'utilisation des formsets – hellsgate

+0

Ok, mais je suis curieux de savoir s'il existe un moyen facile de faire en sorte que l'AutoField soit géré de la même manière que les autres champs (cachés ou non) et non avoir à gérer dans l'url comme vous l'avez fait? –

Questions connexes