为什么我在 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] 来处理样板逻辑。
在我的 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] 来处理样板逻辑。