无法分配“2”:"Card.set" 必须是 "Set" 实例
Cannot assign "2": "Card.set" must be a "Set" instance
我目前正在使用 Django 制作抽认卡网络应用程序。
有一个 'set' 页面(仪表板)和一个 'card' 页面(设置编辑)。当我在卡片页面(set-edit)填写并提交表格以将新卡片添加到已选择进行编辑的集合时,我收到值错误 ' Cannot assign “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,
'form': form,
}
return render(request, '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<b>.instance.set_id = pk</b>
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)
我目前正在使用 Django 制作抽认卡网络应用程序。
有一个 'set' 页面(仪表板)和一个 'card' 页面(设置编辑)。当我在卡片页面(set-edit)填写并提交表格以将新卡片添加到已选择进行编辑的集合时,我收到值错误 ' Cannot assign “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,
'form': form,
}
return render(request, '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<b>.instance.set_id = pk</b>
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)