2011-09-13 4 views
0

J'ai 2 modèles:Comment modifier m2m dans Django via ModelForm

class Case(models.Model): 
Priority = ( 
        ('Blocker', 'Blocker'), 
        ('High', 'High'), 
        ('Medium', 'Medium'), 
        ('Low', 'Low'), 
      ) 
id   = models.AutoField(primary_key=True) 
name  = models.CharField(max_length=200) 
image  = models.URLField(blank=True) 
requirements = models.URLField(blank=True) 
priority = models.CharField(max_length=10, choices=Priority) 
description = models.CharField(max_length=200) 
step  = models.TextField() 
modified = models.DateTimeField(editable=False) 
user  = models.ForeignKey(User, editable=False) 

def save(self, *args, **kwargs): 
    ''' On save, update timestamps ''' 
    if not self.id: 
     self.modified = datetime.datetime.today() 
    super(Case, self).save(*args, **kwargs) 

def __unicode__(self): 
    return self.name 
    return self.description 

class Suite (models.Model): 
    id   = models.AutoField(primary_key=True) 
    name  = models.CharField(max_length=200) 
    features = models.TextField() 
    modified = models.DateTimeField(editable=False, null=True) 
    cases  = models.ManyToManyField(Case, null=True) 
    user  = models.ForeignKey(User, editable=False) 

    def save(self, *args, **kwargs): 
     ''' On save, update timestamps ''' 
     if not self.id: 
      self.modified = datetime.datetime.today() 
     super(Suite, self).save(*args, **kwargs) 

    def __unicode__(self): 
     return self.name 
     return self.description 

Quand je veux créer suite ou cas, il fonctionne très bien:

def addCase(request): 
    c = {} 
    c.update(csrf(request)) 
    user = auth.get_user(request) 
    if request.method == 'POST': 
     form = AddCase(data = request.POST) 
     if form.is_valid(): 
      form.save() 
    else: 
     form = AddCase() 

    return render_to_response('1.html', { 
                'form': form, 
                'js': c.items(), 
                'host' : request.get_host(), 
                'user' : user 
               }) 
def addSuite(request): 
    c = {} 
    c.update(csrf(request)) 
    user = auth.get_user(request) 
    if request.method == 'POST': # If the form has been submitted... 
     form = AddSuite(data = request.POST) 
     if form.is_valid(): 
      form.save() 
    else: 
     form = AddSuite() 

    return render_to_response('2.html', { 
                'form': form, 
                'js': c.items(), 
                'host' : request.get_host(), 
                'user' : user 
               }) 

Mais quand je veux modifier ceux-ci, J'utilise les vues suivantes:

def editSuite (request, suite_id): 
    suite = Suite.objects.get(id=suite_id) 
    name = suite.name 
    features = suite.features 
    cases = suite.cases 
    c = {} 
    c.update(csrf(request)) 
    if request.method == 'POST': # If the form has been submitted... 
     form = EditSuite(data = request.POST) 
     if form.is_valid(): 
      suite = Suite(
         id  = suite_id, 
         name  = form.cleaned_data['name'], 
         features = form.cleaned_data['features'], 
         cases  = request.POST.getlist('cases') 
         ) 
      suite.save() 
#   form.save() 
    else: 
     form = EditSuite(instance = suite) 



    return render_to_response('editsuite.html', { 
     'form': form, 
     'suite': suite, 
     'cases' : request.POST.getlist('cases') 
    }) 

Donc, j'ai besoin de savoir comment sauvegarder la suite éditée. Ajoutant des travaux bien, dans le panneau d'administration fonctionne bien, mais quand j'ai essayé de modifier la suite, je reçois beaucoup d'erreurs différentes. Le moment clé - dans l'administration fonctionne bien. Merci

Répondre

0

Ok, il y avait mon mauvais. Pour modifier les formulaires du modèle m2m, vous devez utiliser quelque chose comme ceci:

form = EditSuite(request.POST, instance = suite) 
    if form.is_valid(): 
     obj = form.save(commit=False) 
     obj.user = request.user 
     cases = request.POST.getlist('cases') 
     obj.save() 
     form.save_m2m()