2010-12-10 6 views
-2

J'ai travaillé avec un modèle simple et je rencontrais des problèmes pour enregistrer les données ModelForm. Je souhaite autoriser les utilisateurs à créer et modifier des objets "Groupe" existants dans la base de données. Si l'utilisateur choisit de "modifier" un groupe existant, je veux que le formulaire résultant soit prérempli avec ces données existantes objets. Ensuite, s'ils cliquent sur "Sauvegarder", ils devraient mettre à jour toutes les données modifiées. Le modèle et la vue que j'utilise sont ci-dessous. Le problème que j'ai est que form.is_valid() ne retourne jamais True. Qu'est-ce que je fais mal ici?django ModelForm help

MODÈLE

class Analyst(models.Model): 
    def __unicode__(self): 
     return unicode("%s, %s"%(self.last, self.first)) 
    id = models.AutoField(primary_key=True) 
    first = models.CharField(max_length=32) 
    last = models.CharField(max_length=32) 

class Alias(models.Model): 
    def __unicode__(self): 
     return unicode(self.alias) 
    alias = models.CharField(max_length=32) 

class Octet(models.Model): 
    def __unicode__(self): 
     return unicode(self.num) 
    num = models.IntegerField(max_length=3) 

class Group(models.Model): 
    def __unicode__(self): 
     return unicode(self.name) 
    name = models.CharField(max_length=32, unique=True) #name of the group 
    id = models.AutoField(primary_key=True) #primary key 
    octets = models.ManyToManyField(Octet, blank=True) #not required 
    aliases = models.ManyToManyField(Alias, blank=True) #not required 
    analyst = models.ForeignKey(Analyst) #analyst assigned to group, required 

VIEW

class GroupEditForm(ModelForm): 
    class Meta: 
     model = Group 

def index(request): 
    if request.method == 'GET': 
     groups = Group.objects.all().order_by('name') 
     return render_to_response('groups.html', 
            { 'groups': groups, }, 
            context_instance = RequestContext(request), 
           ) 

def edit(request): 
    if request.method == "POST": #a group was selected and the submit button clicked on the index page 
     form = GroupEditForm(instance = Group.objects.get(name=request.POST['name'])) #create a form and pre-populate existing data for that object 
    elif request.method == "GET": #the "add new" button was clicked from the index page 
     form = GroupEditForm() #create a new form with no data pre-populated 

    return render_to_response('group_edit.html', 
          { 'form': form, }, 
          context_instance = RequestContext(request), 
          ) 

def save(request): 
    if request.method == "POST": 
     form = GroupEditForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/groups/') 

et le modèle correspondant

Modèle

<h1>Edit Group Information</h1> 
<form method="post" action="/groups/edit/save/">{% csrf_token %} 
<div class="edit"> 
<br></br> 
{{form}} 
</div> 
<br></br> 
<input type="submit" value="Save"> 
<a href="/groups/"><input type="button" name="cancel" value="Cancel" /></a> 
</form> 

Répondre

2

Essayez d'utiliser le django-debug-toolbar. Attachez-le à votre projet et vous serez en mesure de voir ce qui est mis en place sur votre formulaire, peut-être pourquoi il ne passe pas la validation. Il est très facile de se mettre en marche alors faites un essai.

+0

Très belle astuce, merci. L'ajout d'un nouvel enregistrement fonctionne maintenant. Mais, quand j'essaye d'éditer un objet existant, j'obtiens un django.db.IntegrityError au sujet du nom étant un double (unique = vrai). On dirait qu'il essaie d'enregistrer un enregistrement totalement nouveau plutôt que de modifier celui qui existe déjà. Dois-je coder quelque chose dans la vue pour vérifier si elle existe déjà ou existe-t-il une fonction de mise à jour pratique? – nnachefski

1

Votre projet nécessite-t-il une classe ModelForm? Django validera vos modèles correctement s'il connaît le formulaire.

http://docs.djangoproject.com/en/1.2/topics/forms/modelforms/

Quelques notes sur votre code:

La méthode doit venir après vous déclarez votre modèle et vous pouvez manquer le "unicode":

def __unicode__(self): 
    return unicode("%s, %s"%(self.last, self.first)) 

devient,

def __unicode__(self): 
    return "%s, %s" % (self.last, self.first) 

Aussi vous n'en avez pas besoin:

id = models.AutoField (primary_key = True)

comme django le fait pour vous aussi longtemps que vous ne spécifiez pas un autre fiels comme "primary_key = True"

+0

Si vous omettez l'Unicode ou si vous le marquez comme unicode avec un '' ', cela signifie que votre fonction' __unicode__' renvoie maintenant une chaîne ASCII. Si 'self.first' ou' self.last' contient un caractère Unicode, cela se traduira par 'UnicodeDecodeError'. –

+0

Merci pour les conseils, je vais essayer. – nnachefski

Questions connexes