"должен иметь значение для поля" id ", прежде чем можно будет использовать это отношение" многие ко многим " - PullRequest
1 голос
/ 21 июня 2020

Здесь из моего шаблона я получаю список строк с getlist в представлении. Я хочу назначить этот список в моем поле ManyToMany. Я получаю выбранный множественный список в моем представлении, и он также создает объект репортера из этого списка, что нормально.

Теперь я хочу назначить эти выбрано только несколько вариантов в моем поле многие ко многим.

Как это сделать здесь? Я получаю эту ошибку при сохранении формы

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

просмотров

class NewsCreateVView(View):
    template_name = 'add_news.html'

    def get(self, request):
        form = CreateNewsForm()
        return render(request, self.template_name, {'form': form})

    def post(self, request, **kwargs):
        form = CreateNewsForm(request.POST)
        reporters = request.POST.getlist('reporter')
        if form.is_valid():
            news = form.save(commit=False)
            for reporter in reporters:
                obj = Reporter.objects.create(name=reporter)
                news.reporter.add(obj.pk)
            news.save()
            return redirect('list_news')

моделей

class Reporter(models.Model):
   name = models.CharField(max_length=255)
   created = models.DateTimeField(auto_now_add=True)

class News(models.Model):
    title = models.CharField(max_length=255)
    reporter = models.ManyToManyField(Reporter, related_name='reporters')

шаблон

<select class="form-control" name="reporter" multiple="multiple">

1 Ответ

2 голосов
/ 21 июня 2020

Как говорится в ошибке, сначала необходимо сохранить news, чтобы иметь первичный ключ, поэтому:

class NewsCreateVView(View):
    template_name = 'add_news.html'

    def get(self, request):
        form = CreateNewsForm()
        return render(request, self.template_name, {'form': form})

    def post(self, request, **kwargs):
        form = CreateNewsForm(request.POST)
        reporters = request.POST.getlist('reporter')
        if form.is_valid():
            news = <b>form.save()</b>
            pks = [Reporter.objects.create(name=reporter).pk
                   for reporter in reporters]
            news.reporters.add(*pks)
            return redirect('list_news')
...