问题描述
-
我目前正在使用 Django 制作一个抽认卡网络应用程序。
-
有一个“设置”页面(仪表板)和一个“卡片”页面(设置编辑)。当我在卡片页面 (set-edit) 填写并提交表单以将新卡片添加到已选择进行编辑的卡片时,我收到一个值错误 ' 无法分配“2”: “Card.set”必须是“Set”实例。'
-
我不确定为什么会发生这种情况,因为有一个 ID 为 2 的 Set 实例。
对于如何纠正这个问题有什么建议吗?
views.py
###################
##Dashboard views##
###################
def dashboard(request):
set = Set.objects.all()
set_count = set.count()
if request.method == 'POST':
form = SetForm(request.POST)
if form.is_valid():
form.save()
set_name = form.cleaned_data.get('name')
messages.success(request,f'{set_name} has been added')
return redirect('dashboard-dashboard')
else:
form = SetForm()
context = {
'set': set,'form': form,}
return render(request,'dashboard/dashboard.html',context)
#############
##Set views##
#############
#Cards is for when you are adding cards to a set or looking at the content of a set
def set_edit(request,pk):
set_title = Set.objects.get(id=pk)
card = Set.objects.get(id=pk).card_set.all()
set_id = pk
set = Set.objects.get(id=pk)
if request.method == 'POST':
form = CardForm(request.POST)
print('Entered Post condition')
if form.is_valid():
obj = form.save(commit=False)
obj.set = pk
obj.save()
card_name = form.cleaned_data.get('kanji')
messages.success(request,f'{card_name} has been added')
return redirect('dashboard-set-edit',pk)
else:
form = CardForm()
context = {
'card': card,'dashboard/set_edit.html',context)
```
**models.py**
```
class Set(models.Model):
name = models.CharField(max_length=100,null=True)
quantity = models.PositiveIntegerField(null=True,blank=True)
date_created = models.DateTimeField(auto_Now_add=True)
def __str__(self):
return f'{self.id}'
class Card(models.Model):
kanji = models.CharField(max_length=100,null=True)
kana = models.CharField(max_length=100,null=True)
english = models.CharField(max_length=100,null=True)
set = models.ForeignKey(Set,on_delete=models.CASCADE,default=3)
def __str__(self):
return f'{self.id}'
```
**forms.py**
```
class CardForm(forms.ModelForm):
class Meta:
model = Card
# fields = '__all__'
exclude = ('set',)
class SetForm(forms.ModelForm):
class Meta:
model = Set
fields = '__all__'
```
**urls.py**
urlpatterns = [
#########
##Sets###
#########
path('sets/edit/<int:pk>/',views.set_edit,name='dashboard-set-edit'),path('sets/delete/<int:pk>/',views.set_delete,name='dashboard-set-delete'),#########
##Cards##
#########
path('card/delete/<int:pk>/',views.card_delete,name='dashboard-cards-delete'),path('cards/detail/<int:pk>/',views.card_detail,name='dashboard-cards-detail'),path('cards/edit/<int:pk>/',views.card_edit,name='dashboard-cards-edit'),#############
##Dashboard##
#############
path('dashboard/',views.dashboard,name='dashboard-dashboard'),]
```
解决方法
您应该将其分配给 .set_id
,而不是 .set
:
if form.is_valid():
# use set_id ↓
form.instance.set_id = pk
obj = form.save()
card_name = form.cleaned_data.get('kanji')
messages.success(request,f'{card_name} has been added')
return redirect('dashboard-set-edit',pk)