如何在 Django 中从用户模型的字段自动填充和显示数据到来自不同应用程序的另一个模型?
Posted
技术标签:
【中文标题】如何在 Django 中从用户模型的字段自动填充和显示数据到来自不同应用程序的另一个模型?【英文标题】:How to auto-fill and display data in Django from fields of User model to another model from a different app? 【发布时间】:2020-09-26 12:40:06 【问题描述】:我是 Django 的新手,现在我正在为注册用户和非注册用户开发一个支付应用程序项目。我的用户模型有一些来自纸质发票的必填字段,如下所示:
#users/models.py
class User(AbstractBaseUser):
email = models.EmailField(max_length=255, unique=True)
name = models.CharField(max_length=100, blank=False, null=False)
phone = models.CharField(max_length=11, blank=False, null=False)
clientid = models.IntegerField(blank=True, null=False, unique=True)
请注意,身份验证过程基于电子邮件地址,发票付款中的必填字段为“clientid, phone, name”。另一个名为支付的应用程序有 1 个模型类,用于非注册用户和经过身份验证的用户,如下所示:
#payments/models.py
class Payment(models.Model):
invoiceid = models.IntegerField(blank=False, null=False)
name = models.CharField(max_length=50, blank=False, null=False)
amount = models.DecimalField(decimal_places=2, max_digits=20)
email = models.EmailField(max_length=255, blank=False, null=False)
phone = models.CharField(max_length=11, blank=False, null=False)
clientid = models.IntegerField(blank=True, null=False, unique=False)
对于这两种模型,我都使用了简洁的表格,对于非注册用户,如果他们填写所有字段,则很容易付款。 (此操作使用不同的模板)。 我想要实现的是当用户注册并想要付款时,应该自动填写“姓名,电话和客户ID等字段,并仅根据注册用户表以读取模式显示给用户。什么样的我应该使用关系吗?ForeignKey 还是其他的东西? 对于非注册用户,支付应用程序中的 forms.py 文件如下所示:
#payments/forms.py
class PaymentRegister(forms.ModelForm):
invoiceid = forms.IntegerField(widget=forms.TextInput(attrs="placeholder":"Invoice number"))
name = forms.CharField(widget=forms.TextInput(attrs="placeholder":"Name from the invoice")
clientid = forms.IntegerField(widget=forms.TextInput(attrs="placeholder":"Clientid from the invoice"))
amount = forms.DecimalField(widget=forms.TextInput(attrs="placeholder":"Total amount to pay"))
email = forms.EmailField(widget=forms.TextInput(attrs="placeholder":"example@email.com"))
phone = forms.CharField(widget=forms.TextInput(attrs="placeholder":"Phone number"))
class Meta:
model = PaymentRegister
fields = ['invoiceid', 'name', 'clientid', 'amount', 'email', 'phone']
def save(self, commit=True):
payment = super(PaymentRegister, self).save(commit=False)
payment.invoiceid = self.cleaned_data['invoiceid']
payment.name = self.cleaned_data['cumparator']
payment.clientid = self.cleaned_data['clientid']
payment.amount = self.cleaned_data['suma']
payment.email = self.cleaned_data['email']
payment.phone = self.cleaned_data['telefon']
if commit:
payment.save()
return payment
我的观点是注册付款:
#payments/views.py
def payment_register(request):
if request.method == 'POST':
form = PaymentRegister(request.POST)
if form.is_valid():
form.save()
amount = form.cleaned_data.get('amount')
invoiceid = form.cleaned_data.get('invoiceid')
email = form.cleaned_data.get('email')
return redirect('success')
else:
form = PaymentRegister()
return render(request, 'payments/payment.html', 'form':form)
我需要为注册用户创建一个新模型以进行付款,如果答案是“是”,我如何连接用户模型中的“clientid、电话、姓名”字段以注册并在发票模型中显示它们? 现在我的 PaymentRegister 模型对于非注册用户和注册用户看起来是一样的,这是相当多余的。
感谢您的支持!
【问题讨论】:
在您创建自定义用户时从设置中获取身份验证用户并将其作为外键获取 User 模型中的 clientid 不是表中的主键,因此很难为 PaymentRegistration 模型链接此字段。我该怎么办?也许信号可能是个好主意?谢谢 我能得到一个很好的场景来说明你在这里想要实现的目标吗?因为你说你想要来自用户模型的客户端 ID、电话,但这些字段在 payementRegister 模型中。如果您想访问这些字段,则必须将该模型与您想要的位置相关联。 【参考方案1】:从setting.py中导入get user模型
from django.contrib.auth import get_user_model
获取用户作为外键
User= models.ForeignKey(get_user_model(),on_delete=models.CASCADE)
【讨论】:
我需要修改哪个文件才能将用户模型作为外键?因为我需要注册的是带有来自 User 模型的数据的 PaymentRegister 模型。谢谢 在您的付款模式中添加该用户字段,这样您就可以访问所有用户字段 在支付模型中添加用户字段后,如何将用户的clientid分配给PaymentRegister?像这样?class PaymentRegister(models.Model): User = models.ForeignKey(get_user_model(), on_delete=models.CASCADE) clientid = models.ForeignKey('User.clientid', on_delete=models.CASCADE)
以上是关于如何在 Django 中从用户模型的字段自动填充和显示数据到来自不同应用程序的另一个模型?的主要内容,如果未能解决你的问题,请参考以下文章