从ModelChoiceField获取传递给模型

时间:2018-06-08 05:17:37

标签: django django-models django-forms

form.py

class CreateForm(forms.ModelForm):
      parent_id = forms.ModelChoiceField(queryset=Category.objects.all(), required = False)
      name = forms.CharField(max_length = 100)

      class Meta:
         model = Category
         fields = ('parent_id', 'name') 

models.py

class Category(models.Model):
    parent_id = models.IntegerField()
    name = models.CharField(max_length = 50)

    def __str__(self):
        return self.name

view.py

class CreateView(TemplateView):
    template_name = 'create.html'

    def get(self, request):
        form = CreateForm()
        return render(request, self.template_name, {'form' : form})

    def post(self, request):
        form = CreateForm(request.POST)
        if form.is_valid:
            form.save()

        return render(request, self.template_name, {'form' : form})

create.html 的模板中创建表单 html page

我的问题是当我从ModelChoiceField的下拉列表中为create.html中的parent_id选择类别时,我得到的是对象,而不是Id。这就是为什么它显示错误" [字段名称]必须是一个整数"并且不能将值传递给数据库,因为parent_id在models.py中声明为Integer。我需要获取所选值的id并将其传递给' parent_id'下的数据库。领域。 我知道一些有用的东西:

# parent_id = form.cleaned_data('parent_id').id 

我通过这种方式获得了id,但由于form.save()不能从视图中获取任何内容,因此它无法帮助我。它直接与 form.py 一起使用,只需将其保存在此处。

提前致谢

2 个答案:

答案 0 :(得分:3)

正如我在评论中提到的,只需使用ForeignKey(多对一关系),而不是使用 parent_id 直接保存ID。 Django会为你做一切。

class Category(models.Model):
    parent_id = models.IntegerField()
    parent = models.ForeinKey("self",on_delete=models.SET_NULL,blank=True,null=True) 
    # name it parent
    name = models.CharField(max_length = 50)

    def __str__(self):
        return self.name

您的表格将成为:

class CreateForm(forms.ModelForm):
      parent = forms.ModelChoiceField(queryset=Category.objects.all(), required = False)
      name = forms.CharField(max_length = 100)

然后您就可以了,保存表单并创建一个实例,其父作为Category实例本身。

答案 1 :(得分:1)

您可以将parent_id表单的字段重命名为parent。因此form.save()将期望父实例:

class CreateForm(forms.ModelForm):
      parent = forms.ModelChoiceField(queryset=Category.objects.all(), required = False)
      name = forms.CharField(max_length = 100)

      class Meta:
         model = Category
         fields = ('parent', 'name') 

注意,parent应为型号ForeignKey