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})
我的问题是当我从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 一起使用,只需将其保存在此处。
提前致谢
答案 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
。