首页 > 解决方案 > Django:ModelForm注册覆盖prevoius对象

问题描述

我一直在尝试根据 Codecademy Django 路径中的项目制作自己的项目。以兽医办公室为例。我目前正在构建提供的基本代码,并添加了表单。我目前正在尝试使用 ModelForms 注册新所有者,然后在 vetoffice 显示所有注册所有者的列表。但是当我注册一个新的所有者时,以前的所有者似乎被覆盖了,并且只显示了新的所有者。

我对编写 Django 很陌生,所以我的代码并不完美。

车主型号:

class Owner(models.Model):
    #The Owner table, with OwnerID as primary key
    #Owner can own several pets
    """Create the Owner SQLite Table.

    Primary Key: OwnerID, used as Foreign Key for paitient

    Fields: first_name(String), last_name(string), phone(string(of numbers))

    __str__ for easy coupling first and last name of owner.

    Function: has_multiple_pets
                reurns boolean True if owner have several pets registered with the Vet Office.
    """
    ownerID = models.BigAutoField(primary_key=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    phone = models.CharField(max_length=30)
    def __str__(self):
        #Returns the first and last name of owner with whitespace between
        return self.first_name + " " + self.last_name

    def has_multiple_pets(self):
        '''Do Owner have multiple pets.

        Checks if a owner have multiple pets registered at the vet Vetoffice
        and returns a boolean.

        parameters: self

        returns: boolean (True if owned pets are greater then 1)
        '''
        return self.patient_set.count() > 1

业主表格:

class OwnerForm(ModelForm):
    class Meta:
        model = Owner
        fields = ['first_name', 'last_name', 'phone']
        labels = {
            'first_name' : 'First Name:',
            'last_name' : 'Family name:',
            'phone' : 'Phone'
        }

楼主观点:

def owner(request):
    owner_list = Owner.objects.order_by('last_name')
    context = {'owner_list' : owner_list}
    return render(request, 'vetoffice/owner.html', context)


def register_owner(request):
    if request.method == "POST":
        form = OwnerForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('vetoffice:home')
    else:
        form = OwnerForm()
    return render(request, 'vetoffice/register_owner.html', {'form' : form})

以及用于显示所有者列表的 HTML:

<ul>
  {% for owner in owner_list %}
  <li>
    Name: {{ owner.last_name }}, {{ owner.first_name }} -- Phone: {{ owner.phone }}
  </li>
  {% endfor %}
</ul>

我希望注册所有者表单自动生成唯一的主键,但是当我尝试注册新所有者时,我得到:

NOT NULL 约束失败:vetoffice_owner.ownerID

请求方法:POST 请求 URL: http: //127.0.0.1 :8000/register/owner Django 版本:3.2.8 异常类型:IntegrityError 异常值:

NOT NULL 约束失败:vetoffice_owner.ownerID

标签: pythondjangodjango-forms

解决方案


推荐阅读