Django == 1.11
我有一个简单的 models.py
,其中包含 task
和 label
(它应该是可以选择的复选框)。
class Task(models.Model):
author = models.ForeignKey('auth.User', on_delete=models.PROTECT)
name_task = models.CharField(max_length=1000)
label_task = models.ManyToManyField(LabelTask)
def __str__(self):
return self.name_task
和标签
class LabelTask(models.Model):
name = models.CharField(max_length=1000)
def __str__(self):
return self.name
forms.py
看起来像
class CreateTask(forms.ModelForm):
label_task = forms.ModelMultipleChoiceField(queryset=LabelTask.objects.all(), required=False,
widget=forms.CheckboxSelectMultiple)
class Meta:
model = Task
exclude = ['author']
还有我的views.py
@login_required
def secret_page(request):
form = CreateTask(request.POST or None)
if form.is_valid():
print('Valid')
instance = form.save(commit=False)
instance.author = request.user
instance.save()
messages.success(request, "Successfully Created")
else:
print('Not valid')
form = CreateTask()
return render(request, 'task/task.html', {'form': form})
例如,转到浏览器并以以下形式输入一些数据 - https://www.dropbox.com/s/rf7tbbvushln94d/Screenshot%20from%202018-05-09%2011-33-24.png?dl=0
然后按提交
。
我们看到了什么? https://www.dropbox.com/s/h27kdqddl1ns0r1/Screenshot%20from%202018-05-09%2011-33-56.png?dl=0
我们只选择了 Python
,但在管理中,我们看到了整个选择。
我不明白为什么会这样。
谢谢。
最佳答案
当您使用 commit=False
保存表单时,您需要调用表单的save_m2m
保存多对多数据的方法。
if form.is_valid():
print('Valid')
instance = form.save(commit=False)
instance.author = request.user
instance.save()
form.save_m2m()
请参阅 the modelform save method 的文档了解更多信息。
如果你在更改代码后创建一个新任务(仍然勾选python),那么你仍然会在Django管理中看到所有标签任务,但是python
现在将被选择。
关于python - 未将 checkbox-es 保存到 Django 管理数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50248969/