在 Django 中使用 createview 时出现 NOT NULL 约束失败错误

问题描述

我正在尝试使用 createview 在我的模型中创建一个新条目。模型 Venue 与 Adress 模型是单调关系,我无法让它更新该模型。我尝试使用自定义表单,但总是出现以下错误

IntegrityError at /evcreate/

NOT NULL constraint Failed: kammem_person.padress_id

form.py:

class AdressForm(ModelForm):

    street=CharField(max_length=100)
    snumb=CharField(max_length=15)
    town=CharField(max_length=100)
    postn=CharField(max_length=5,validators=[postnvali])
    
    class Meta:
        model=Person
        exclude=['padress']

查看:

class EvCreate(CreateView):

    form_class=AdressForm
    template_name='kammem/create.html'
    success_url=reverse_lazy('event')

    def form_valid(self,form):
        
        street=form.cleaned_data['street']
        snumb=form.cleaned_data['snumb']
        town=form.cleaned_data['street']
        postn=form.cleaned_data['postn']
        form.vadress=Adress.objects.create(street=street,snumb=snumb,town=town,postn=postn)

        return super().form_valid(form)

models.py

class Person(Model):

    fname=CharField(default="missing",max_length=100)
    lname=CharField(default="missing",max_length=100)
    mobil=PhoneField(default='9999999999')
    mail=EmailField(default='contact@gmail.com')
    padress=OnetoOneField(Adress,on_delete=CASCADE,primary_key=True)

    def __str__(self):
        return self.fname

    class Meta:
        ordering=('fname','lname')

class Venue(Model):

    vname=CharField(default="",max_length=100)
    vamil=EmailField(default='contact@gmail.com')
    vpage=CharField(default='homepage',max_length=100)
    vadress=OnetoOneField(Adress,primary_key=True)
    
    def __str__(self):
        return 'Venue: ' + self.vname

url.py

   path('evcreate/',EvCreate.as_view(),name='evcreate'),

我真的在寻找答案,但没有成功。有什么线索吗?

解决方法

您缺少已设置为主键的地址

在 AdressForm 中,您已经排除了 padress,如果表单有效,Django 创建视图会自动创建对象。

尝试这样的事情

def form_valid(self,form):
    form.padress = # Adress object
    form.save()
    # rest