2011-02-17 4 views
7

dans mon model.pydjango sauver modèle ForeignKey relation

class Layer(models.Model): 
    user = models.IntegerField() 
    name = models 
    ... 

class Point(models.Model): 
    layers = models.ForeignKey(Layer) 
    meta = models.TextField() 
    ... 

dans mon view.py

def datasave(request, id): 
    mid = request.POST.get("layerid",default = "") 
    metas = request.POST.get("meta",default = "") 

    cs = Point() 
    cs.layers = mid 
    cs.meta = metas 
    cs.save() 

mais il donne une erreur dans mon django debug..in mon projet, j'utilise GeoDjango, openlayers et extjs ... je n'ai pas trouvé de solution sur enregistrer mon post

je n'ai pas fait de relation avec ma clé étrangère .. fondamentalement, je veux faire une couche que quand je voulez ajouter un point dans ma couche, je veux enregistrer mon point avec ID de couche ....

Répondre

8

Il est utile de poster le retraçage pour aider à comprendre votre problème (pour des questions futures).

Il me semble que vous transmettez un nombre à l'attribut layers de votre instance Point qui provoquerait un ValueError. Le seul endroit où vous pouvez passer un nombre à un champ de clé étrangère est dans un formulaire django qui effectue la recherche pour vous.

Vous devez affecter une instance réelle Layer à la place.

cs = Point() 
cs.layers = Layer.objects.get(id=mid) 
cs.meta = metas 
cs.save() 
+0

ths pour votre aide mais quand j'ai fait votre solution il a donné "featureadd() prend exactement 2 arguments (1 donné)" comment puis-je résoudre ceci? – aragon

+0

Mon changement de 1 ligne ne causerait pas cette erreur. Vous pouvez poster le retraçage pour plus d'aide si! –

+0

Je ne sais pas ce que signifie la traceback ... comment puis-je prendre ce – aragon

13

Une façon plus efficace est de spécifier la clé étrangère en ajoutant un « _id » à la fin, comme ceci:

cs = Point(layers_id = mid, meta = metas) 
cs.save() 

NE PAS faire couches = XXX.objects.get (id = ###) parce que cela double le nombre de requêtes de base de données.

AUSSI ... vous ne nettoyez pas vos données POST ici, ce qui est assez dangereux. Obtenez-le comme ceci:

from django import forms 
id_field = forms.IntegerField() 
layer_id = id_field.clean(request.POST.get("layerId", "") 
+0

Cela devrait être accepté répondre – Dejell