Django: использование save (commit = false) при сохранении формы, расширенной из формы. Формы - PullRequest
0 голосов
/ 03 октября 2018

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

"Order: None" должно иметь значение для поля "id", прежде чем можно будет использовать это отношение "многие ко многим".

Но проблема в том, что у меня есть 2 метода сохранения, вызываемыеони также создают 2 разных журнала (сначала save() создает экземпляр, а после буквы - его редактирует), и это вызывает хаос.Поэтому я хочу иметь возможность commit=False в первом и завершить сохранение во втором save().Commit используется для ModalForm, однако моя форма расширяется form.Forms.

views.py

if request.method == 'POST':
    form = OrderAddForm(request.POST)

    if form.is_valid():
        order = Order()
        order.user = request.user
        order.save()

        order.ordered_materials.set(form.cleaned_data['ordered_materials'])
        order.location = form.cleaned_data['location']
        order.note = form.cleaned_data['note']

        form.save()
else:
    form = OrderAddForm()

forms.py

class OrderAddForm(forms.Form):
  ordered_materials = forms.ModelMultipleChoiceField(
      queryset=Material.objects.all(),
  )
  location = forms.CharField()
  note = forms.CharField()

  ordered_materials.widget.attrs.update({'id': 'materialsid',
                                 'class': 'form-control',
                                 })

models.py

class Order(models.Model):

user = models.ForeignKey(User,
                         on_delete=models.CASCADE)

ordered_materials = models.ManyToManyField('Material')
location = models.CharField(max_length=500)
note = models.CharField(max_length=30,
                        verbose_name="Note")

STATUS = (
    ('n', 'None'),
    ('a', 'Accepted'),
    ('r', 'Rejected'),
)

status_name = models.CharField(max_length=1,
                               choices=STATUS,
                               default='n')

def __str__(self):
    return str(self.id)

1 Ответ

0 голосов
/ 03 октября 2018

Вам не нужно сохранять объект после установки поля «многие ко многим».Поэтому вы должны иметь возможность изменить свой код так, чтобы вы звонили save() только один раз.

if form.is_valid():
    order = Order()
    order.user = request.user
    order.location = form.cleaned_data['location']
    order.note = form.cleaned_data['note']
    order.save()

    order.ordered_materials.set(form.cleaned_data['ordered_materials'])
...