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
和label
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
然后按submit
。
我们看到了什么? https://www.dropbox.com/s/h27kdqddl1ns0r1/Screenshot%20from%202018-05-09%2011-33-56.png?dl=0
我们只选择了Python
,但在管理员中,我们看到了整个选择。
我不明白为什么会这样
谢谢。
答案 0 :(得分:1)
使用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
。