django ModelForm сохранить проблему с ManyToManyField - PullRequest
0 голосов
/ 10 декабря 2010

Я новичок в Django и нуждаюсь в некоторой помощи при ошибке просмотра, которую я получаю.

Я написал представление, которое будет отображать таблицу данных «Группы», если метод запроса - GET, или отображать форму для редактирования определенной «Группы», если метод запроса - POST (элемент для редактирования передается.с данными POST).

Также, если POST для существующего элемента, я бы хотел, чтобы форма была предварительно заполнена данными, которые у меня уже есть в таблице для этого элемента.У меня все получилось, за исключением того, что когда я иду, чтобы сохранить отредактированную форму, я получаю эту ошибку:

"Невозможно установить значения для ManyToManyField, который задает промежуточную модель"

Любая помощь будет принята с благодарностью.Кроме того, я новичок во всех этих вещах для веб-разработчиков, так что, если я делаю что-то совершенно глупое или пропускаю концепцию, пожалуйста, не стесняйтесь поджигать меня соответственно.; -)

Модель

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)

Вид

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

Чтобы завершить, вот формакод шаблона, который я использую для визуализации таблицы и редактирования страницы. Шаблон

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

1 Ответ

1 голос
/ 10 декабря 2010

Попробуйте удалить промежуточные модели OctetAssignment и AliasAssignment.Их следует использовать только тогда, когда вы хотите добавить к ним настраиваемые поля.В противном случае Django создает их и использует их прозрачно.

...