【问题标题】:<News:somethinng>" needs to have a value for field "id" before this many-to-many relationship can be used<News:something>" 需要为字段 "id" 设置一个值,然后才能使用这种多对多关系
【发布时间】:2020-06-21 16:39:40
【问题描述】:

从我的模板中,我在视图中获取带有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">

【问题讨论】:

    标签: django django-models django-views


    【解决方案1】:

    正如错误所说,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 = form.save()
                pks = [Reporter.objects.create(name=reporter).pk
                       for reporter in reporters]
                news.reporters.add(*pks)
                return redirect('list_news')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2020-08-08
      相关资源
      最近更新 更多