2016-07-19 3 views
1

I`m с помощью Django 1.9 с следующее:Джанго ModelForm с ManyToManyField привычка экономить к БД

views.py:

def a_new(request): 
    # submit button 
    if request.method == "POST": 
     form = AForm(request.POST) 
     if form.is_valid(): 
      post = form.save(commit=False) 
      post.save() 
      return redirect('ui:config-list') 
    # first visit 
    else: 
     form = AForm() 

    template = 'api/test_template.html' 
    context = RequestContext(request, {'form': form}) 
    return render_to_response(template, context) 

forms.py:

class AForm(forms.ModelForm): 

    b= forms.ModelMultipleChoiceField(
     queryset=B.objects.all(), 
     widget=FilteredSelectMultiple("b", is_stacked=False) 
    ) 

    class Meta: 
     model = A 
     fields = ('name', 'b',) 

test_template.html

... 
<form role="form" class="form-inline" action="" method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    <div> 
     {{ form.name }} 
     {{ form.b }} 
    </div> 


    <div class="dl-horizontal"> 
     <button type="submit" class="btn btn-success">Save</button> 
    </div> 
</form> 

models.py:

class A(models.Model): 
    name = models.CharField(max_length=100) 
    b = models.ManyToManyField(B, null=True, blank=True, name='b') 
... 

Проблема в том, что при использовании кнопки «Сохранить» в элементе создается только поле имени. Элемент b, в котором используется виджет, просто не сохраняется в БД с созданным новым элементом A (он показывает ошибку, если я оставляю поле b пустым, поэтому я думаю, что его проверка тоже).

В чем может быть проблема?

+0

Вы пытались проверить, что данные идут для поля «b». Попробуйте form.cleaned_data.get ('b') – Prateek

+0

Где я могу попробовать? С точки зрения? – Rada

+0

Какой инструмент отладки вы используете? Если вы используете ipdb, вы можете поместить эту строку «import ipdb; ipdb.set_trace()» ниже form.is_valid(). Затем вы можете попробовать это на своей консоли, где работает ваш сервер. Если у вас нет ipdb, просто установите его, это отличный инструмент для отладки. – Prateek

ответ

1

the documentation об использовании commit=False, когда у вас есть поле «многие-ко-многим».

Обратите внимание, что нет причин для использования здесь commit = False. Удалите его, а второе сохраните, и Django автоматически сохранит ваши значения.

+0

Я удалил две строки save(), заменив ее «form.save()». Работал! – Rada

1

b is ManyToManyField, он хранится в таблице A. В другой таблице поддерживается соотношение между A и B.

1

Если у вас есть поле M2M и не сохранять (фиксации = False), вы должны вызвать это в конце:

form.save_m2m() 

См docs.