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