python - Django - 当用户提交表单时,会创建表,但表之间的连接不是

标签 python django database-design web-development-server

我正在开发一个小项目,客户可以访问我的网站并注册与其姓名相关的电话号码。这是一种连接方式注册(其中 number1 <--> number2 是一个连接),因此每个 session 仅注册两个电话号码。当查看特定电话号码时(例如在管理面板中),我想查看它所属的用户的 id 以及它所属的连接的 id。当我以相同的方式查看连接时,我想查看谁注册了该特定连接,以及在同一 session 中注册的两个电话号码。

我的问题:所有外键都会给出“django.db.utils.IntegrityError:NOT NULL 约束失败”错误。我必须为要提交的客户数据的所有外键设置 null=True 。 ManyToManyField 不会产生任何错误 - 但它不会像应有的那样将每个连接限制为仅在 session 中注册的两个电话号码。

因此,在添加数据时不会建立上面概述的这种结构化连接。就像每个电话号码、每个连接以及每个用户都成为自己的小岛,与其他表没有联系。当我点击管理面板中的“连接”时,已建立的每个连接都会在那里列出,但是当我选择它时,我会看到所有曾经注册过的电话号码。我选择的每个连接都是一样的。当我选择一个电话号码时,没有任何东西可以将它连接到添加它的用户,或者“它所属的连接”。

我的 models.py 文件:

from django.db import models 

class Customer(models.Model):
    customer_name = models.CharField(max_length=100)
    customer_email = models.CharField(max_length=100)

class Phonenumber(models.Model):
    customer_number = models.CharField(max_length=100)
    belongs_to = models.ForeignKey(Customer, on_delete=DO_NOTHING)

class Connections(models.Model):
    registered_at = DateTimeField(auto_now=True)
    got_number_at = DateTimeField(default=None)  # this becomes the date the connection was made
    registered_by = models.ForeignKey(Customer, on_delete=DO_NOTHING)
    phonenumber_id = models.ManyToManyField(Phonenumber)

我的phonebook_form.py文件:

from django.forms import ModelForm
from django import forms
from .models import *

class CustomerForm(ModelForm):
    class Meta:
        model = Customer
        fields = ['name', 'email']

        widgets = {
            'name': TextInput(attrs={'class':'form-control', 'id': 'cus_name'})}
            'email': TextInput(attrs={'class':'form-control', 'id': 'cus_email'})}

class NumberForm(ModelForm):
    class Meta:
        model = Phonenumber
        fields = ['customer_number']

        widgets = {
            'customer_number': TextInput(attrs={'class':'form-control', 'id': 'cus_number'})}

class ConnectionForm(ModelForm):
    class Meta:
        model = Connections
        fields = ['got_number_at']

        widgets = {
            'got_number_at': TextInput(attrs={'class':'form-control', 'id': 'connection_date'})}

我的views.py文件:

from django.shortcuts import render
from .phonebook_form import *

from1 = CustomerForm()
form2 = NumberForm()
form3 = ConnectionForm()

if request.method = "POST":
    form_customer = CustomerForm(request.POST)
    form_number = NumberForm(request.POST)
    form_connection = ConnectionForm(request.POST)
    if form_customer.is_valid():
        form_customer.save()
    if form_number.is_valid():
        form_number_save()
    if form_connection.is_valid():
        form_connection.save()

context = {'form1': form1,
           'form2': form2,
           'form3': form3
           } 

return render(request, 'phoneBook/phonebook.html') 

我还添加了数据库关系模式的图片:

我什至不知道从哪里开始解决这个问题。我看过很多 django 网站构建器教程并阅读了很多文章,所有这些似乎都以完全相同的方式完成,没有任何问题。我缺少什么? (虽然我已经使用 python 两年了,但我在 Django(1 周)和一般 Web 开发方面完全是初学者,所以修复越简单越好)

最佳答案

您的表单将检查电话号码是否正确(表单的字段),如果是正确的,则在数据库中保存一条记录,但它不会链接到恰好保存在同一 View 中的项目。并不是说你想以任何方式链接这些对象,或者也许有很多方法可以连接它。因此,表单不会看起来像另一个表单所构造的那样。程序员必须实现链接逻辑。

我们可以先检查所有表单是否有效,然后使用一种表单包装的对象将其设置为另一种表单包装的对象,例如:

if form_customer.is_valid() and form_number.is_valid() and form_connection.is_valid():
    <strong>customer =</strong> form_customer.save()
    form_number<strong>.instance.belongs_to = customer</strong>
    <strong>phone_number =</strong> form_number_save()
    form_connection<strong>.instance.registered_by = customer</strong>
    connecion = form_connection.save()
    connection.phonenumber_id.<strong>add(phone_number)</strong>

Note: In case of a successful POST request, you should make a redirect [Django-doc] to implement the Post/Redirect/Get pattern [wiki]. This avoids that you make the same POST request when the user refreshes the browser.

关于python - Django - 当用户提交表单时,会创建表,但表之间的连接不是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68407444/

相关文章:

python - ModuleNotFoundError : No module named 'sklearn.linear_model._base'

python - 使用chdir后找不到任何文件或目录

python - 如何将 Django 查询设置为列明智地呈现到 html 表中?

mysql - 动态值的数据库结构

sql-server - 银行交易表——可以做得更好吗?

python - Series.astype 当 copy=False 但 dtype 不同时创建副本

python - 当另一个线程处于事件状态时,为什么不在全局对象上调用__del__?

python - LAN Dashboard 技术推荐

mysql - 添加外键后 Django 迁移出现 "unknown column"错误

database-design - 如何在数据库中没有枚举字段的情况下处理枚举?