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