2010-12-10 9 views
-2

Ich habe mit einem einfachen Modell gearbeitet und hatte Probleme beim Speichern der ModelForm-Daten. Ich möchte Benutzern ermöglichen, vorhandene "Group" -Objekte in der Datenbank zu erstellen und zu bearbeiten. Wenn der Benutzer eine vorhandene Gruppe "bearbeiten" möchte, möchte ich, dass das resultierende Formular mit den vorhandenen Daten der Objekte vorab ausgefüllt wird. Wenn sie dann auf "Speichern" klicken, sollten alle geänderten Daten aktualisiert werden. Das Modell und die Ansicht, die ich verwende, sind unten. Das Problem, das ich habe, ist, dass form.is_valid() niemals True zurückgibt. Was mache ich hier falsch?django ModelForm help

MODEL

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/') 

und die entsprechende Vorlage

Vorlage

<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> 

Antwort

2

Versuchen Sie, die django-debug-toolbar zu verwenden. Hängen Sie es an Ihr Projekt an und Sie werden sehen können, was in Ihrem Formular festgelegt wurde, vielleicht warum es die Validierung nicht besteht. Es ist sehr einfach aufzustehen und loszulegen, also probier es aus.

+0

Sehr schöne Spitze angeben, danke. Das Hinzufügen eines neuen Datensatzes funktioniert jetzt. Aber wenn ich versuche, ein existierendes Objekt zu bearbeiten, bekomme ich einen django.db.IntegrityError über den Namen, der ein Duplikat ist (unique = True). Es sieht so aus, als würde es versuchen, einen völlig neuen Datensatz zu speichern, anstatt den bestehenden zu modifizieren. Muss ich etwas in der Ansicht kodieren, um zu prüfen, ob es bereits existiert oder gibt es eine praktische Update-Funktion? – nnachefski

1

Benötigt Ihr Projekt eine ModelForm-Klasse?

Django validiert Ihre Modelle gut, wenn es über die Form weiß.

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

Ein paar Anmerkungen zu Ihrem Code:

Die Methode sollte kommen, nachdem Sie Ihr Modell erklären und Sie können die "Unicode" verpassen:

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

wird,

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

Auch Sie brauchen dies nicht:

id = models.AutoField (primary_key = True)

als django dies für Sie tut, solange man nicht eine andere fiels als "primary_key = True"

+0

Wenn Sie den Unicode weglassen oder ihn mit einem u als Unicode markieren, bedeutet dies, dass Ihre Funktion "__unicode__" jetzt eine ASCII-Zeichenfolge zurückgibt. Wenn entweder 'self.first' oder' self.last' ein Unicode-Zeichen enthalten, führt dies zu einem 'UnicodeDecodeError'. –

+0

Danke für die Tipps, ich werde es versuchen. – nnachefski