未保存复选框到Django admin db

时间:2018-05-09 08:38:53

标签: python django

Django == 1.11
我有一个简单models.py tasklabel(它应该是可以选中的复选框)。

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,但在管理员中,我们看到了整个选择。 我不明白为什么会这样 谢谢。

1 个答案:

答案 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