【问题标题】:NOT NULL constraint failed error when using createview in django在 django 中使用 createview 时出现 NOT NULL 约束失败错误
【发布时间】:2021-02-02 12:49:02
【问题描述】:

我正在尝试使用 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,on_delete=CASCADE,,primary_key=True)
    
    def __str__(self):
        return 'Venue: ' + self.vname

url.py

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

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

【问题讨论】:

  • form.vadress= 你的意思是写form.instance.padress= (在你的form_validEvCreate 的方法中)?此外,AddressForm 这个名称非常具有误导性,因为它是一种创建 Person 实例的表单
  • 这个名字有误导性,真的。是的,我的意思是 form.instance.padress=

标签: python django model relation


【解决方案1】:

您缺少已设置为主键的 padress

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

试试这样的

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    相关资源
    最近更新 更多