无法分配“2”:“Card.set”必须是“Set”实例

问题描述

  • 我目前正在使用 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)