python - 在 Django 中是否有处理多种表单和模型的好方法?
问题描述
我正在构建一个应用程序,其中我有一个包含多个多对多字段和一些外键字段的模型,我需要一个允许我在一个页面中创建所有内容并让我为多对多字段输入多次的视图,但我没有知道如何在同一页面/视图中处理大量表单。
主要型号
class Client(models.Model):
company_name = models.CharField(max_length=255, blank=True, null=True)
payment_method = models.CharField(max_length=64, null=True, blank=True)
owner = models.CharField(max_length=100, blank=True, null=True)
operation = models.CharField(max_length=50, blank=True, null=True)
value = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)
currency = models.CharField(max_length=55, null=True, blank=True)
address = models.ManyToManyField(Address, blank=True)
contact = models.ManyToManyField(Contact, blank=True)
relationship = models.ManyToManyField(Relationship, blank=True)
attachment = models.ManyToManyField(Attachment, blank=True)
billing = models.ForeignKey(Billing, null=True, blank=True, on_delete=models.CASCADE)
delivery = models.ForeignKey(Delivery, null=True, blank=True, on_delete=models.CASCADE)
author = models.ForeignKey(User, on_delete=models.DO_NOTHING, blank=True, null=True)
note = models.TextField(blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.company_name
其他型号
class Address(models.Model):
address = models.CharField(max_length=256, null=True, blank=True)
number = models.PositiveIntegerField(null=True, blank=True)
district = models.CharField(max_length=32, null=True, blank=True)
city = models.CharField(max_length=32, null=True, blank=True)
country = models.CharField(choices=COUNTRY_CHOICES, max_length=64, null=True, blank=True)
def __str__(self):
return self.address
class Contact(models.Model):
name = models.CharField(max_length=256, blank=False, null=True)
sector = models.CharField(max_length=64, blank=True, null=True)
email = models.EmailField(max_length=256, blank=True, null=True)
phone = PhoneField(blank=True, null=True)
cellphone = PhoneField(blank=True, null=True)
role = models.CharField(max_length=155, blank=True, null=True)
nfe = models.BooleanField(verbose_name='NFE', default=False)
def __str__(self):
return self.name
class Relationship(models.Model):
company = models.CharField(max_length=256, blank=False, null=True)
agent = models.ForeignKey(Vendedor, on_delete=models.DO_NOTHING, blank=True, null=True)
type = models.CharField(choices=TYPE_CHOICES, max_length=32, blank=True, null=True)
contact = models.CharField(max_length=128, blank=True, null=True)
def __str__(self):
return self.company
class Attachment(models.Model):
file = models.FileField(upload_to='post/img/%Y/%m/%d', blank=True, null=True)
note = models.CharField(verbose_name='Observação', max_length=256, blank=True, null=True)
author = models.ForeignKey(User, on_delete=models.DO_NOTHING)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.note
class BankAccount(models.Model):
bank = models.CharField(max_length=64, blank=False, null=True)
type = models.CharField(max_length=32, blank=False, null=True)
payment_method = models.CharField(max_length=64, blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.bank
class Billing(models.Model):
name = models.CharField(max_length=256, blank=True, null=True)
address = models.ForeignKey(Address, null=True, blank=True, on_delete=models.CASCADE)
email = models.EmailField(max_length=256, blank=True, null=True)
phone = PhoneField(blank=True, null=True)
contact = models.CharField(max_length=256, blank=True, null=True)
def __str__(self):
return self.name
class Delivery(models.Model):
name = models.CharField(max_length=256, blank=True, null=True)
address = models.ForeignKey(Address, null=True, blank=True, on_delete=models.CASCADE)
email = models.EmailField(max_length=256, blank=True, null=True)
phone = PhoneField(blank=True, null=True)
contact = models.CharField(max_length=256, blank=True, null=True)
def __str__(self):
return self.name
有谁知道处理这个问题的最佳方法是什么?
解决方案
制作一个 python 文件 forms.py 并为您拥有的所有模型制作模型表单。然后在视图中使用所有表单创建一个函数。然后在 html 文件中使用 jinja2 一起调用不同的表单。这是一个简单的例子:
模型.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class UserProfileInfo(models.Model):
user = models.OneToOneField(User, on_delete = models.CASCADE)
Your_website = models.URLField(blank = True)
profile_pic = models.ImageField(upload_to="profile_pics", blank = True)
def __str__(self):
return self.user.username
该模型通过 OneToOneField 连接到 django 用户模型。然后在 forms.py 中,我为模型创建了所有模型表单。
from django import forms
from django.contrib.auth.models import User
from basic.models import UserProfileInfo
from django.core import validators
class userform(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput())
re_enter_password = forms.CharField(widget=forms.PasswordInput())
class Meta():
model = User
fields = ("username", "email", "password")
class UserProfileInfoForm(forms.ModelForm):
class Meta():
model = UserProfileInfo
fields = ('Your_website', "profile_pic")
然后使用两种模型形式制作视图。
def register(request):
registered = False
if request.method == 'POST':
user_form = forms.userform(data = request.POST)
profile_form = forms.UserProfileInfoForm(data = request.POST)
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save()
user.set_password(user.password)
user.save()
profile = profile_form.save(commit=False)
profile.user = user
if 'profile_pic' in request.FILES:
profile.profile_pic = request.FILES['profile_pic']
profile.save()
registered = True
else:
print(user_form.errors, profile_form.errors)
else:
user_form = forms.userform()
profile_form = forms.UserProfileInfoForm()
在 html 文件中调用这两种形式,如下所示:
<div class="container">
<form method="post" enctype="multipart/form-data" class="all_forms">
{% csrf_token %}
{{ user_form.as_p }}
{{ profile_form.as_p }}
<input type="submit" class="btn btn-primary" value="Register Now!">
</form>
</div>
这样您就不必为模型创建多个表单,用户只会被询问一个表单,所有模型将从一个表单中获得单独的响应。
推荐阅读
- rest - 使用 REST 返回一个值
- reactjs - nextjs中“页面”内的CSS
- c++ - 如何在类中分配多维数组?当行>列时会引发错误?
- javascript - Node js 使用 mocha chai 测试受保护的路由?
- wso2 - 是否可以使用 wso2 Identity Server 获取非 oauth2 令牌并将其与 wso2 APIManager 一起使用?
- php - 如何获取指定了所有关系数据的数据
- spring-boot - 在 docker-compose 上为 Spring Boot 应用程序发送应用程序参数?
- python - 如何从 Pandas 合并打印错误类型?
- python - 如何在文本行中替换这些值
- web-services - 英语是描述 Web 服务(Rest、SOAP 等)的标准吗?