0

我想创建一个用于管理图书馆的 web 应用程序。我创建了书和类别模型。类别是书“历史文学 ..ect”的类,我希望在添加书时类别显示为选项。所以我把它放进去ModelChoiceField,但是当我尝试将值保存ModelChoiceField在数据库中时,它没有。

这是代码。

模型.py

from django.db import models

# Create your models here.
class Category(models.Model):
    name = models.CharField(max_length=100)
class Livre(models.Model):
    titre = models.CharField(max_length=30,null=True)
    category=models.CharField(max_length=30,null=True)
    num_category=models.ForeignKey(Category, on_delete=models.CASCADE,null=True)
    auteur=models.CharField(max_length=30,null=True)
    nombre_copie=models.IntegerField(default=0,null=True)
    publisher=models.CharField(max_length=30,null=True)

表格.py

from django import  forms
from . import models
from project.models import Category

class Ajouterlivre(forms.Form):
    titre = forms.CharField(max_length=100)  
    category = forms.ModelChoiceField(queryset=Category.objects.values_list('name', flat=True))
    auteur = forms.CharField(max_length=100)
    nombre_copie = forms.IntegerField()
    publisher = forms.CharField(max_length=100)

视图.py

def Ajoutlivre(request):

    if request.method== 'POST':
        form=forms.Ajouterlivre(request.POST)
        if form.is_valid():
           objt=Livre()
           objt.titre = form.cleaned_data['titre']
           objt.category= form.cleaned_data['category']
           objt.auteur = form.cleaned_data['auteur']
           objt.nombre_copie = form.cleaned_data['nombre_copie']
           objt.publisher = form.cleaned_data['publisher']
           objt.save()
        return redirect('home')
    else:
        form=forms.Ajouterlivre()
    return render(request,'livre/ajout-livre.html',{'form':form})
4

1 回答 1

0

ModelchoiceField 需要查询集返回字典而不是元组,当您使用 values_list 时,它返回一个元组。因此您必须更改代码中的类别 (**) 行才能正常工作。

class Ajouterlivre(forms.Form):
    titre = forms.CharField(max_length=100)  
    **category = forms.ModelChoiceField(queryset=Category.objects.all())**
    auteur = forms.CharField(max_length=100)
    nombre_copie = forms.IntegerField()
    publisher = forms.CharField(max_length=100)

希望这能解决您的问题。

于 2020-07-27T16:59:25.740 回答