在 Django 视图中获取多项选择查询集并保存

Posted

技术标签:

【中文标题】在 Django 视图中获取多项选择查询集并保存【英文标题】:get a multiple choice queryset in Django view and save it 【发布时间】:2018-11-12 20:23:55 【问题描述】:

我有一个带有外键的多项选择字段。我想保存参加培训课程的守门员,并且我想将所有守门员列为多项选择字段。

class AddAttendance(forms.ModelForm):
attendanceKeeper = Attendance.objects.only("keeper","present").all()
keeperValues = Attendance.objects.values_list("keeper__id", flat=True).distinct()
keeper = forms.ModelMultipleChoiceField(widget=forms.widgets.CheckboxSelectMultiple, queryset=Keeper.objects.filter(id__in=keeperValues, status=1))

class Meta:
    model = Attendance
    fields = ('keeper',)

def __init__(self, *args, **kwargs):
    super(AddAttendance, self).__init__(*args, **kwargs)
    self.initial["keeper"] = Keeper.objects.all()

但是我的问题是,我不熟悉如何处理视图中的查询集以及如何循环遍历它并使用值 True 或 False 保存每个实例。

我总是收到无法分配查询集的值错误

"Attendance.keeper" must be a "Keeper" instance

你能帮我如何访问查询集值并保存它们

def new_attendance(request, team_pk, package_pk):
if request.method == "POST":
    form = AddAttendance(request.POST)
    if form.is_valid():
        for item in form:
            attendance = item.save(commit=False)
            attendance.keeper = get_object_or_404(AddAttendance.keeper)
            attendance.team = get_object_or_404(Team, pk=team_pk)
            attendance.created_date = timezone.now()
            attendance.save()
            return redirect(reverse('select_package', args=[package_pk, team_pk]))
else:
    form = AddAttendance()
return render(request, 'attendance/new_attendance.html', 'form': form)

最后我想从查询集中匹配 keeper 并将 True/False 保存到我的模型中存在的字段中

class Attendance(models.Model):
session = models.ForeignKey(Session)
keeper = models.ForeignKey(Keeper)
team = models.ForeignKey(Team)
present = models.BooleanField()
created_date = models.DateTimeField(default=timezone.now)
edited_date = models.DateTimeField(default=timezone.now)

【问题讨论】:

get_object_or_404(AddAttendance.keeper) 应该做什么? 另外,你应该发布你的模型。 我尝试在我的考勤模型中将表单的管理员与外键字段管理员匹配 实际上,我认为错误是在那之前发生的,因为该代码会给出完全不同的错误。如果您发布了完整的回溯,我们就会知道。 【参考方案1】:

您不想要多选字段;你想要一个单一的选择。每个出勤对象只能关联一个守门员。

你在这里做了一堆奇怪和不必要的事情。您应该删除大部分代码,并使用默认为 ForeignKey 的 ModelChoiceField。您也不需要复选框小部件,因为这又是用于多种选择;也许单选按钮是合适的。

class AddAttendance(forms.ModelForm):
    class Meta:
        model = Attendance
        fields = ('keeper',)
        widgets = 'keeper': forms.Radioselect
    # remove the __init__ and the field definitions, you don't need them

...

form = AddAttendance(request.POST)
if form.is_valid():
    attendance = item.save(commit=False)
    attendance.team = get_object_or_404(Team, pk=team_pk)
    attendance.created_date = timezone.now()
    attendance.save()
    return redirect(reverse('select_package', args=[package_pk, team_pk]))

无需在视图中显式设置 keeper,因为这就是表单正在做的事情。

【讨论】:

好的,我可能会尝试单选,但这会使用户输入不太友好。谢谢@DanielRoseman

以上是关于在 Django 视图中获取多项选择查询集并保存的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何使用查询集并在模板中显示结果?

jQuery Chosen:如何从多项选择中获取所选选项文本的数组

带有全选选项的 swift 3.0 多项选择

如何合并两个查询集并在 django 中创建新的查询集

将 Django 中的多对多关系表示为两个多项选择

使用ivx小模块制作单项和多项选择器的经验总结