Сохранение полей ManytoMany в Django с несколькими формами - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь сделать следующее в 3 формах, которые обрабатываются одновременно: 1. Сохраните строку темы для электронного письма (это работает) 2. Сохраните содержимое электронного письма. (это работает) 3. Сохраните заголовок электронного письма (работает) и сохраните отношение к строке темы и содержанию электронного письма (не работает).

Я прочитал каждую страницу, что мог сделать с ошибками. Я пробовал это разными способами, но все они не помогли мне.

View.py:


def email_subject_create_view(request):
    if request.method == 'POST':
        email_subject_form = EmailSubjectForm(request.POST)
        email_content_form = EmailContentForm(request.POST)
        email_form = EmailForm(request.POST)
        if email_subject_form.is_valid() and email_content_form.is_valid() and email_form.is_valid() :
            subject = email_subject_form.save(commit=False)
            subject.time_created = datetime.datetime.now()
            contractor = Contractor.objects.get(user_id=request.user.id)
            subject.save()
            email_subject_form.save_m2m()

            content = email_content_form.save(commit=False)
            content.time_created = datetime.datetime.now()
            content.save()
            email_content_form.save_m2m()

            email = email_form.save(commit=False)
            email.time_created = datetime.datetime.now()

            # this is what I want to do. email.email_core_contents is a M2M field
            email.email_subject_lines = subject.id


            email.save()

context = {
        'email_subject_form': EmailSubjectForm(),
        'email_content_form': EmailContentForm(),
        'email_form': EmailForm(),
}
return render(request, 'advertise/email_subject_create.html', context)

Я пробовал:

email.email_subject_lines = EmailSubject.objects.get(pk=subject.id)
email.email_subject_lines.set(subject)
email.email_subject_lines.set(pk=subject.id)

Я также пробовал без .save_m2m() частей кода.

Редактировать:

Ошибка в основном примере:

Direct assignment to the forward side of a many-to-many set is prohibited. Use email_subject_lines.set() instead.

Ошибка в 1 из 3 набора:

Direct assignment to the forward side of a many-to-many set is prohibited. Use email_subject_lines.set() instead.

Ошибка в 2из набора 3:

"<Email: sfeaesfe>" needs to have a value for field "id" before this many-to-many relationship can be used.

Ошибка в наборе 3 из 3:

"<Email: graegre>" needs to have a value for field "id" before this many-to-many relationship can be used.

1 Ответ

0 голосов
/ 01 ноября 2019

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

1: используйте метод добавления.

email.email_subject_lines.add(subject)
email.email_core_contents.add(content)

2. Извлеките оба объекта (Email и EmailSubject) из базы данных снова.

email2 = Email.objects.get(id=email.id)
subject2 = EmailSubject.objects.filter(id=subject.id)
email2.email_subject_lines.set(subject2)
email2.save()

Не уверен, почему это работает вторым способом, но не оригинальным способом. Обратите внимание, что мне пришлось использовать filter вместо get во втором выражении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...