python - 无法在 Django 外键字段中插入值
问题描述
我试图在 django 的外键字段中插入值。但它向我展示了这样的错误:- 无法分配“'95'”:“Catalog.author_id”必须是“作者”实例。 但是当我尝试使用 django shell 插入时,它没有显示任何错误,它工作正常。请帮帮我我附上了我的代码,你可以很好地理解
模型.py
class Author(models.Model):
author_id = models.CharField(max_length=50, primary_key=True)
name = models.CharField(max_length=50)
city = models.CharField(max_length=50)
country = models.CharField(max_length=50)
def __str__(self):
return str(self.author_id)
class Catalog(models.Model):
book_id = models.IntegerField(primary_key=True)
title = models.CharField(max_length=100)
year_of_publish = models.CharField(max_length=5)
price = models.IntegerField()
author_id = models.ForeignKey('Author', on_delete=models.CASCADE, null=True)
def __str__(self):
return str(self.book_id)
表格.py
class Catalog_Details(forms.ModelForm):
book_id = forms.CharField(widget=forms.TextInput(
attrs={'class': 'form-control',
'placeholder': 'Enter book id'}
), required=True, max_length=50)
title = forms.CharField(widget=forms.TextInput(
attrs={'class': 'form-control',
'placeholder': 'Enter title'}
), required=True, max_length=50)
year_of_publish = forms.CharField(widget=forms.TextInput(
attrs={'class': 'form-control',
'placeholder': 'Enter Published Year'}
), required=True, max_length=5)
author_id = forms.ModelChoiceField(queryset=Author.objects.values_list(
'author_id', flat=True))
price = forms.CharField(widget=forms.TextInput(
attrs={'class': 'form-control',
'placeholder': 'Enter Price'}
), required=True, max_length=50)
class Meta():
model = Catalog
fields = ['book_id', 'title', 'year_of_publish', 'price', 'author_id']
视图.py
@login_required
def catalog(request):
if request.user.is_authenticated:
if request.method == 'POST':
form = Catalog_Details(request.POST)
if form.is_valid():
author_id = form.cleaned_data['author_id']
m = Author.objects.get(author_id=author_id)
c1 = Catalog(book_id=form.cleaned_data['book_id'], title=form.cleaned_data['title'],
year_of_publish=form.cleaned_data['year_of_publish'],price=form.cleaned_data['price'], author_id=m)
c1.save()
form = Catalog_Details()
else:
form = Catalog_Details()
return render(request, 'catalog.html', {'form': form})
解决方案
我认为甚至没有必要覆盖author_id
表单中的字段。您可以author_id
从Catalog_Details
. 你可以像这样更新你的视图:
@login_required
def catalog(request):
if request.method == 'POST':
form = Catalog_Details(request.POST)
if form.is_valid():
form.save()
form = Catalog_Details()
# here you should redirect to a success page to know `Catalog_Details` has been created
else:
form = Catalog_Details()
return render(request, 'catalog.html', {'form': form})
仅供参考,您不应ForeignKey
使用 suffix 命名字段_id
,因为 django 会为您创建它。例如:在您的情况下,您会author_id_id
在Catalog
模型中找到一个字段,该字段将返回一个整数值(作者表列的主键)。
推荐阅读
- html - HTML default namespace vs. explicit namespace
- javascript - Javascript 扩展运算符可以包含对象的未定义字段吗?
- uwp - UWP 多视图:关闭主视图时关闭所有辅助视图
- jquery - 取消单身日期
- codenameone - 在代号中从一个点到另一个点画直线
- json - 使用动态密钥解组 json
- python - 为什么当声明为变量名称时,我不能使用 OpenCV 将图像复制并粘贴到某个位置?
- xml - Xquery 不要“过滤”第一个带有属性的 TAG
- python - 在 Pandas (python) 中,如何添加由两列引用的 groupby 列
- outlook-addin - 确定已在 Outlook 加载项图标单击上选择了哪个操作