【问题标题】:ValueError: Cannot assign : must be an instanceValueError:无法分配:必须是实例
【发布时间】:2019-08-04 14:25:43
【问题描述】:

所以我对 Django 很陌生,我正在尝试保存模型 Ovelse 的新实例,它有一个指向另一个模型 Okt 的外键。我有一个视图,其中包含所有 Okt 实例的列表,该列表链接到连接到每个 Okt 的所有 Ovelse 实例。

模型.py

class Okt(models.Model):

def __str__(self):
    return '{}, uke {}, dag {}'.format(self.sykel_navn, self.sykel_uke, self.sykel_dag)


sykel_navn = models.CharField(max_length=8, default="Sykel 1")
sykel_dag = models.CharField(max_length=(1), choices=(SYKEL_DAGER))
sykel_uke = models.CharField(max_length=(1), choices=(SYKEL_UKER))
dato = models.DateTimeField('Dato på treningsøkt: ')
notater = models.CharField(max_length=400)


class Ovelse(models.Model):

okt = models.ForeignKey(Okt, on_delete=models.CASCADE)
ovelse_type = models.CharField(max_length=2, choices=MUSKELGRUPPE_CHOICES)
ovelse_navn = models.CharField(max_length=20)
vekt = models.IntegerField(default=0, name='kg')
sets = models.PositiveIntegerField(default=2)
reps = models.PositiveIntegerField(default=2)

def __str__(self):
    return self.ovelse_navn

views.py

class OvelseCreateView(generic.CreateView):
model = Ovelse
template_name = 'trening/add.html'
form_class = OvelseForm

def form_valid(self, form):
    form.instance.okt = self.kwargs.get('pk')
    return super(OvelseCreateView, self).form_valid(form)

forms.py

class OvelseForm(forms.ModelForm):

class Meta:
    model = Ovelse
    exclude = ['okt',]
    fields = ['ovelse_navn', 'ovelse_type', 'kg', 'sets', 'reps']

def __init__(self, *args, **kwargs):
    super(OvelseForm, self).__init__(*args, **kwargs)
    self.fields['ovelse_type'].label = "Muskler brukt"
    self.fields['ovelse_navn'].label = "Navn på øvelsen"
    self.fields['kg'].label = "Antall kilo"
    self.fields['sets'].label = "Antall set"
    self.fields['reps'].label = "Antall reps"

当我尝试提交表单时,我收到错误消息:无法分配“1”:“Ovelse.okt”必须是“Okt”实例,而我希望创建实例的新模型。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    由于您正在“注入”主键本身,而不是 Okt 对象,因此您应该使用 .okt_id 而不是 .okt

    class OvelseCreateView(generic.CreateView):
    
        model = Ovelse
        template_name = 'trening/add.html'
        form_class = OvelseForm
    
        def form_valid(self, form):
            form.instance.okt_id = self.kwargs.get('pk')
            return super(OvelseCreateView, self).form_valid(form)

    请注意,您可以在表单的Meta 类中设置标签,无需为此覆盖__init__ 文件:

    class OvelseForm(forms.ModelForm):
    
        class Meta:
            model = Ovelse
            exclude = ['okt',]
            fields = ['ovelse_navn', 'ovelse_type', 'kg', 'sets', 'reps']
            labels = {
                'ovelse_type': 'Muskler brukt',
                'ovelse_navn': 'Navn på øvelsen',
                'kg': 'Antall kilo',
                'sets': 'Antall set',
                'reps': 'Antall reps'
            }

    【讨论】:

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