开发者

django ModelForm save issue with ManyToManyField

I'm new to Django and was needing some help on a view error i am getting.

I wrote a view that will display a data table of "Groups" if the request method is GET, or display a form to edit a particular "Group" if the request method is POST (item to edit is passed with POST data).

Also, if POST on an existing item, i'd like the form to be pre-populated with the data i already have in the table for that item. I've pretty much got it all down, except when i goto save an edited form, i keep getting this error:

"Cannot set values on a ManyToManyField which specifies an intermediary model"

Any help would be greatly appreciated. Also, I'm new to all this web dev stuff, so if i'm doing something completely silly or am missing a concept, please feel free to flame me accordingly. ;-)

Model

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)

View

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(开发者_如何学Python'/tradedesk/groups/') # Redirect after POST

To make it complete, here is the form template code i'm using that renders the table and edit page. Template

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


Try to remove the intermediary models OctetAssignment and AliasAssignment. They should be used only when you want to add custom fields to them. Otherwise Django creates them and uses them transparently by itself.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜