2012-04-21 3 views
3

Y a-t-il un moyen de contourner la "nécessité d'avoir une valeur de clé primaire avant qu'une relation plusieurs-à-plusieurs peut être utilisée"?comment définir les valeurs par défaut pour manytomanyfield

J'ai un modèle avec plusieurs champs, y compris une relation plusieurs-à-plusieurs à un autre modèle. J'ai une fonction pour définir les valeurs par défaut sur ces champs lorsque je crée une nouvelle instance du modèle. Je fais ceci dans la vue en manipulant un HTTP GET. Le champ m2m est rendu en utilisant un formset.

Voici quelques pseudo-code décrivant la situation:

class MyRelatedModel(models.Model): 
    name = models.CharField(max_length=100,blank=True) 

class MyModel(models.Model): 
    name = models.CharField(max_length=100,blank=True) 
    relatedModels = models.ManyToManyField("MyRelatedModel") 

    def initialize(self): 
    self.name = "my default name" 
    # this bit doesn't really matter... 
    # just assume I am creating a new set of RelatedModels that I want to associate with my this new MyModel... 
    newRelatedModels = [] 
    for name in ["related model 1", "related model 2", "related model 3"]: 
     relatedModel = MyRelatedModel(name=name) 
     relatedModel.save() 
     newRelatedModels.append(relatedModel.id) 
    self.relatedModels = newRelatedModels # this is invalid! 

def MyView(request): 
    if request.method == 'GET': 
    model = MyModel() 
    model.initialize() 
    form = MyForm(instance=model) 
    return render_to_response("my_template.html", {"form" : form}, context_instance=RequestContext(request)) 

Toutes les suggestions?

Je pense que je devrais peut-être gérer cela sur le côté de la forme plutôt que sur le côté du modèle, mais cela me déroute aussi.

+0

Vous devez enregistrer le modèle avant raleted avec d'autres modèles. Quelque chose comme self.save() – danihp

Répondre

2

Pour le formulaire ce qui fonctionne pour moi dans 1.3.1:

est quelque chose de similaire à ce , le manytomany dans le inital

avec hardcode ids:

def MyView(request): 
    if request.method == 'GET': 
     model = MyModel(name = "my default name") 
     initial = { 'relatedModels': [1,] } # assuming you knew the id and wanted to hardcode it 
     form = MyForm(instance=model, initial=initial) 
     return render_to_response("my_template.html", {"form" : form}, context_instance=RequestContext(request)) 

aide d'une requête pour remplir par des noms:

def MyView(request): 
    if request.method == 'GET': 
     model = MyModel(name = "my default name") 
     initial = { 'relatedModels': [ o.pk for o in list(MyRelatedModel.objects.filter(name__in=("related model 1", "related model 2", "related model 3")))], } 
     form = MyForm(instance=model, initial=initial) 
     return render_to_response("my_template.html", {"form" : form}, context_instance=RequestContext(request)) 
1
for name in ["related model 1", "related model 2", "related model 3"]: 
    relatedModel = MyRelatedModel(name=name) 
    relatedModel.save() 
    self.relatedModels.add(relatedModel) 

Ou:

newRelatedModels = [] 
for name in ["related model 1", "related model 2", "related model 3"]: 
    relatedModel = MyRelatedModel(name=name) 
    relatedModel.save() 
    newRelatedModels.append(relatedModel) 
self.relatedModels.add(*newRelatedModels) 

Cela devrait fonctionner aussi:

self.relatedModels = newRelatedModels 
+0

Je pense que le problème est que 'self' n'a pas de valeur pour' pk' tant que 'self' n'est pas sauvegardé. Cela signifie que le problème ne vient pas du mode lié sauvegarder, apparaît quand auto lui assigner le modèle avant de prendre un pk. – danihp

+0

Bien sûr, vous auriez dû enregistrer l'objet 'model' avant d'appeler' initialize' – San4ez

Questions connexes