Django - 当用户提交表单时,创建表,但表之间的连接不是
Django - when user submits a form, tables are created, but the connection between the tables is not
我正在做一个小项目,客户可以访问我的网站并注册与其姓名关联的 phone 号码。这是一个连接注册(其中 number1 <--> number2 是一个连接),所以每个会话只注册两个 phone 号码。查看特定 phone 号码时(例如,在管理员面板中),我想查看它所属的用户的 ID 以及它所属的连接的 ID。当我以相同的方式查看连接时,我想查看谁注册了该特定连接,以及在同一会话中注册的两个 phone 号码。
我的问题:所有 外键出现“django.db.utils.IntegrityError:NOT NULL 约束失败”错误。我必须为要提交的客户数据的所有外键设置 null=True。 ManyToManyField 没有给出任何错误 - 但它不会像它应该的那样将每个连接限制为仅在会话中注册的两个 phone 号码。
所以,上面概述的这种结构化连接不是在添加数据时建立的。就像每个 phone 号码、每个连接和每个用户都成为自己的小岛,与其他表无关。当我在管理面板中单击 'connections' 时,已建立的每个连接都列在那里,但是当我 select 它时,我看到 all phone 曾经注册过的号码。我选择的每个连接都是一样的。当我 select 一个 phone 号码时,没有任何东西可以将它连接到添加它的用户,或者它所属的“连接”。
我的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 开发的完全初学者,所以修复越简单越好)
您的表单将检查 phone 数字是否正确(您表单的字段),如果正确则在数据库中保存一条记录,但它不会 link恰好保存在同一视图中的项目。并不是说您想以任何方式 link 这些对象,或者也许有很多方法可以连接它。因此,表单将看不到另一个表单构造的内容。程序员必须实现 linking 逻辑。
我们可以先检查所有的形式是否有效,然后用一种形式包裹的对象设置为另一种形式包裹的对象,如:
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.
我正在做一个小项目,客户可以访问我的网站并注册与其姓名关联的 phone 号码。这是一个连接注册(其中 number1 <--> number2 是一个连接),所以每个会话只注册两个 phone 号码。查看特定 phone 号码时(例如,在管理员面板中),我想查看它所属的用户的 ID 以及它所属的连接的 ID。当我以相同的方式查看连接时,我想查看谁注册了该特定连接,以及在同一会话中注册的两个 phone 号码。
我的问题:所有 外键出现“django.db.utils.IntegrityError:NOT NULL 约束失败”错误。我必须为要提交的客户数据的所有外键设置 null=True。 ManyToManyField 没有给出任何错误 - 但它不会像它应该的那样将每个连接限制为仅在会话中注册的两个 phone 号码。
所以,上面概述的这种结构化连接不是在添加数据时建立的。就像每个 phone 号码、每个连接和每个用户都成为自己的小岛,与其他表无关。当我在管理面板中单击 'connections' 时,已建立的每个连接都列在那里,但是当我 select 它时,我看到 all phone 曾经注册过的号码。我选择的每个连接都是一样的。当我 select 一个 phone 号码时,没有任何东西可以将它连接到添加它的用户,或者它所属的“连接”。
我的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 开发的完全初学者,所以修复越简单越好)
您的表单将检查 phone 数字是否正确(您表单的字段),如果正确则在数据库中保存一条记录,但它不会 link恰好保存在同一视图中的项目。并不是说您想以任何方式 link 这些对象,或者也许有很多方法可以连接它。因此,表单将看不到另一个表单构造的内容。程序员必须实现 linking 逻辑。
我们可以先检查所有的形式是否有效,然后用一种形式包裹的对象设置为另一种形式包裹的对象,如:
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.