Je suis nouveau à Django et avait besoin d'aide sur une erreur de vue que je reçois. J'ai écrit une vue qui affichera une table de données de "Groupes" si la méthode de demande est GET, ou affichera un formulaire pour éditer un "Groupe" particulier si la méthode de demande est POST (l'article à éditer est passé avec POST Les données).django ModelForm enregistrer le problème avec ManyToManyField
En outre, si POST sur un élément existant, j'aimerais que le formulaire soit pré-rempli avec les données que j'ai déjà dans la table pour cet élément. J'ai à peu près tout ce qu'il faut descendre, sauf quand je goto enregistrer un formulaire édité, je continue à obtenir cette erreur:
« Impossible de définir des valeurs sur une ManyToManyField qui spécifie un modèle intermédiaire »
Toute aide serait très appréciée. De plus, je suis nouveau sur tous ces trucs de développement web, donc si je fais quelque chose de complètement bête ou si je manque un concept, n'hésitez pas à me flamber en conséquence. ;-)
Modèle
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) #name of the group
id = models.AutoField(primary_key=True) #primary key
octets = models.ManyToManyField(Octet, through='OctetAssignment', blank=True) #not required
aliases = models.ManyToManyField(Alias, through='AliasAssignment', blank=True) #not required
class OctetAssignment(models.Model):
octet = models.ForeignKey(Octet) #octet
group = models.ForeignKey(Group) #group that octet is assigned to
class AliasAssignment(models.Model):
alias = models.ForeignKey(Alias)
group = models.ForeignKey(Group)
Voir
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),
)
elif request.method == "POST":
g = Group.objects.get(id=request.POST['id'])
form = GroupEditForm(instance=g)
return render_to_response('groups.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('/tradedesk/groups/') # Redirect after POST
Pour le rendre complet, voici le code de modèle de formulaire J'utilise qui rend la page de table et modifier. Modèle
<h1>Group Information</h1>
{% if groups %}
<table border=1>
{% for group in groups %}
<tr>
<td>{{group.name}}</td>
<td>{% for octet in group.octets.all %} {{octet}} {% endfor %}</td>
<td>{% for alias in group.aliases.all %} {{alias}} {% endfor %}</td>
<td>{{group.analyst}}</td>
</tr>
{% endfor %}
</table>
<br></br>
<form method="post" action="/groups/">{% csrf_token %}
<select name="id" >
{% for group in groups %}
<option value="{{group.id}}">{{group.name}}</option>
{% endfor %}
</select>
<input type="submit" value="Edit">
</form>
{% endif %}
{% if form %}
<form method="post" action="/groups/save/">{% csrf_token %}
{{form}}
<br></br>
<input type="submit" value="Save">
<form>
{% endif %}
</div>
Pas de dés, ça n'a pas marché. Il a effectivement cassé ma table de données sur la vue GET. – nnachefski
oh attends! Cela a fonctionné, je n'étais simplement pas "en train d'ajouter" la relation avec mon script de graine DB. Merci beaucoup pour l'aide! – nnachefski