为什么我在 Django 中的 ManyToManyField 只返回一个值?

Why is my ManyToManyField in Django returning only one value?

在我的 Django 项目中,我有一个带有 ManyToManyField 的 class:

class ContestCategory(models.Model):
    name = models.CharField(max_length=70, blank=False, null=False)
    judges = models.ManyToManyField('users.CustomUser', null=True)

迁移后我可以看到一切正常,table 已创建。我做了一个表格来改变评委:

class JudgesForm(forms.ModelForm):
    class Meta:
        model = ContestCategory
        fields = ['judges']

    def __init__(self, *args, **kwargs):
        super(JudgesForm, self).__init__(*args, **kwargs)

在我看来,表单出现并正确显示了所有 CustomUser 对象,并且在保存时没有显示错误。但是,在我的 post 方法中,当我这样做时:

class SubmissionCategoriesDetailView(LoginRequiredMixin, DetailView):
    model = ContestCategory
    template_name = 'reportes/detail_submission_categories.html'
    form_class = JudgesForm

    def post(self, request, *args, **kwargs):# 1711   5656    2230400    7616
        pk_category = kwargs.get('pk')
        judges = request.POST.get('judges')

        logging.info(str(judges))

        return HttpResponseRedirect(reverse('reportes:submission_categories'))

我在日志中得到 'judges' returns 我的 CustomUser 的正确 ID,但前提是我只选择了一个 CustomUser。每当我选择多个时,它只会在 'judges' 中提供最后一个选择的 ID,而不是所有的 ID。

为什么会这样?我应该使用与自动部件不同的部件还是模型中缺少某些部件?任何帮助将不胜感激。

因为 request.POST.get(…) [Django-doc] always returns one value. If you want to return all values, you should make use of request.POST.getlist(…) [Django-doc]:

from django.shortcuts import redirect

class SubmissionCategoriesDetailView(LoginRequiredMixin, DetailView):
    model = ContestCategory
    template_name = 'reportes/detail_submission_categories.html'
    form_class = JudgesForm

    def post(self, request, *args, **kwargs):
        pk_category = kwargs.get('pk')
        judges = request.POST.<b>getlist(</b>'judges'<b>)</b>

        logging.info(str(judges))

        return redirect('reportes:submission_categories')

但是最好使用表格来处理数据:

from django.shortcuts import redirect

class SubmissionCategoriesDetailView(LoginRequiredMixin, DetailView):
    model = ContestCategory
    template_name = 'reportes/detail_submission_categories.html'
    form_class = JudgesForm

    def post(self, request, *args, **kwargs):
        form = <b>JudgesForm(</b>request.POST<b>)</b>
        if form.is_valid():
            logging.info(str(<b>form.cleaned_data['judges']</b>))

        return redirect('reportes:submission_categories')

您可能想看一下 UpdateView [Django-doc] 来处理样板逻辑。