【问题标题】:ValueError... "Contestant.contest" must be a "Contest" instanceValueError...“Contestant.contest”必须是“Contest”实例
【发布时间】:2021-10-18 14:58:22
【问题描述】:

我正在尝试通过模型表单创建参赛者,每个参赛者都是竞赛模型的外键,每当我尝试提交表单以创建新参赛者时,都会出现值错误:

Cannot assign "27": "Contestant.contest" must be a "Contest" instance. ```

I have two models, Contest and Contestant in my `models.py`


    ```class Contest(models.Model):
        contest_title = models.CharField(max_length=30)
        contest_post = models.CharField(max_length=100)
    
    
    
    class Contestant(models.Model):
        contest = models.ForeignKey(Contest, on_delete=models.CASCADE, related_name='participating_contest')
        contestant_name = models.CharField(max_length=10, blank=True, null=True)
        contestant_intro = models.CharField(max_length=30, blank=True, null=True)
        contestant_post = models.CharField(max_length=100, blank=True, null=True)

在我的 urls.py 中,我试图将竞赛主键 (PK) 传递给表单 urls.py

    path('contestant/<int:pk>/new/', views.ContestantCreateView.as_view(), name='new-contestant'),

我在views.py 中使用django 的createview 并尝试将pk 传递给表单的form_valid 函数。 views.py


    class ContestantCreateView(CreateView):
        model = Contestant
        fields = ['contestant_name', 'contestant_intro', 'contestant_post']
    
        def form_valid(self, form):
            form.instance.contest = self.kwargs.get('pk')
            return super().form_valid(form)

我尝试将 views.py 更改为


    class ContestantCreateView(CreateView):
        model = Contestant
        fields = ['contestant_name', 'contestant_intro', 'contestant_post']
    
        def form_valid(self, form):
            contesting_contest = Contest.objects.get(participating_contest=pk)
            contesting_contest.contest = form.instance.contest
            return super().form_valid(form)

但我得到了 NameError at /contests/contestant/27/new/ name 'pk' is not defined

【问题讨论】:

    标签: python django django-models django-views django-forms


    【解决方案1】:

    您应该将其分配给contest_id,而不是contest,因为该字段需要Contest 对象:

    class ContestantCreateView(CreateView):
        model = Contestant
        fields = ['contestant_name', 'contestant_intro', 'contestant_post']
    
        def form_valid(self, form):
            form.instance.contest_id = self.kwargs['pk']
            return super().form_valid(form)

    【讨论】:

      猜你喜欢
      • 2021-03-10
      • 2021-04-08
      • 2018-06-03
      • 1970-01-01
      • 2019-11-14
      • 2020-04-04
      • 2023-03-27
      • 2021-05-05
      相关资源
      最近更新 更多