2010-07-14 2 views
3

J'utilise ModelForm dans django pour insérer et des objets de mise à jour dans ma base de données, mais lorsque je tente de mettre à jour je ne vois pas la clé primaire/id de l'objet mis à jour:Où est la clé primaire de l'objet que je veux mettre à jour dans django en utilisant modelform?

Mon modèle:

class Category(models.Model): 
    name = models.CharField(max_length=20, db_index = True) 

et ma forme:

class CategoryForm(ModelForm): 
    class Meta: 
     model = Category 
     fields = ['name'] 

et dans mon modèle, je suis:

{% csrf_token %} 
{{ category_form.as_p }} 

À mon avis je fais

cat = Category.objects.get(pk = cat_id) 
data['category_form'] = CategoryForm(instance = cat) 

et transmettre les données à mon modèle, ce qui rend la forme ok, mais l'id de l'objet que je sur le point de mise à jour est nulle part dans la source html. Comment le code peut-il alors maintenant quel objet mettre à jour?

Je me sens stupide de poser cette question, car il devrait être assez basique, mais j'ai suivi tous les tutoriels et regardé à travers les docs django, googlé et rechercher ce site sans chance.

Merci d'avance.

Répondre

0

La clé primaire est un attribut appelé "id" sur votre objet d'instance "cat". Le formulaire lui-même, et dans votre exemple représenté par "cat_id". Le formulaire Modèle doit prendre soin de suivre la clé primaire - tout ce que vous devez faire est de transmettre les données "request.POST" résultantes dans CategoryForm, validez les données avec is_valid(), puis enregistrez-le.

à savoir

form_with_post = CategoryForm(request.POST) 
if form_with_post.is_valid(): 
    form_with_post.save() 
else: 
    ... return the form_with_post through the context to display the errors 
0

L'ID n'a pas besoin d'être dans le code HTML, car vous avez passé l'instance dans l'objet de formulaire lorsque vous l'instanciez. Django met simplement à jour cette instance lorsque vous faites form.save().

4

Où se trouve cat_id provenant de votre point de vue? Je suppose que vous recevez dans l'URL, comme ceci:

url(r'categories/(\d+)/edit/', your_view, {}), 

dans urls.py quelque part. Maintenant, à votre avis, vous pouvez le lire à partir de l'argument de la fonction de vue appropriée:

def your_view(request, cat_id): 

Maintenant, vous pouvez obtenir l'objet avec id approprié, que vous faites ici:

cat = Category.objects.get(pk = cat_id) 

... et instancier ModelForm le passant cat objet si vous souhaitez modifier l'objet existant, ou ne le passez pas, si vous voulez un formulaire vide pour la création d'objet.

Questions connexes