【问题标题】:Cannot assign "2": "Card.set" must be a "Set" instance无法分配“2”:“Card.set”必须是“Set”实例
【发布时间】:2021-06-07 15:35:23
【问题描述】:
  • 我目前正在使用 Django 制作一个抽认卡 Web 应用程序。

  • 有一个“设置”页面(仪表板)和一个“卡片”页面(设置编辑)。当我在卡片页面 (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,
            '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'),
]

```

【问题讨论】:

    标签: python django django-forms foreign-keys


    【解决方案1】:

    你应该把它分配给.set_id,而不是.set

    if form.is_valid():
        #     use set_id &downarrow;
        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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多