微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django 中处理多个表单和模型有什么好的方法吗?

如何解决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,null=True)
    operation = models.CharField(max_length=50,null=True)
    value = models.DecimalField(max_digits=8,decimal_places=2,blank=True)
    currency = models.CharField(max_length=55,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,on_delete=models.CASCADE)
    delivery = models.ForeignKey(Delivery,on_delete=models.CASCADE)

    author = models.ForeignKey(User,on_delete=models.DO_nothing,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,blank=True)
    number = models.PositiveIntegerField(null=True,blank=True)
    district = models.CharField(max_length=32,blank=True)
    city = models.CharField(max_length=32,blank=True)
    country = models.CharField(choices=COUNTRY_CHOICES,max_length=64,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,null=True)
    email = models.EmailField(max_length=256,null=True)
    phone = PhoneField(blank=True,null=True)
    cellphone = PhoneField(blank=True,null=True)
    role = models.CharField(max_length=155,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,null=True)
    agent = models.ForeignKey(vendedor,null=True)
    type = models.CharField(choices=TYPE_CHOICES,max_length=32,null=True)
    contact = models.CharField(max_length=128,null=True)

    def __str__(self):
        return self.company


class Attachment(models.Model):
    file = models.FileField(upload_to='post/img/%Y/%m/%d',null=True)
    note = models.CharField(verbose_name='Observação',max_length=256,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,null=True)
    type = models.CharField(max_length=32,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,null=True)
    address = models.ForeignKey(Address,on_delete=models.CASCADE)
    email = models.EmailField(max_length=256,null=True)
    contact = models.CharField(max_length=256,null=True)

    def __str__(self):
        return self.name


class Delivery(models.Model):
    name = models.CharField(max_length=256,null=True)

    def __str__(self):
        return self.name

有谁知道处理这个问题的最佳方法是什么?

解决方法

制作一个python文件 forms.py 并为您拥有的所有模型制作模型表格。然后在视图中使用所有形式创建一个函数。然后在 html 文件中使用 jinja2 一起调用不同的表单。这是一个简单的例子:

models.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>

这样您就不必为模型创建多个表单,用户将只被询问一个表单,所有模型将从一个表单中获得单独的响应。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。