基于两个不同模型的Django Form自定义

zi8p0yeb  于 2023-11-20  发布在  Go
关注(0)|答案(2)|浏览(98)

我在Django中有以下3个模型。

models.py
=============

class Customer(models.Model):
    name = models.CharField(max_length=255, null=False, unique=True)
    
class Service(models.Model):
    name = models.CharField(max_length=255, null=False)
    architecture = models.NameField()
    
class customer_services(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True, related_name='customer_service_entries')
    service = models.ForeignKey(Service, on_delete=models.SET_NULL, null=True, related_name='customer_service_entries')
    start = models.DateField()
    end = models.DateField()

字符串
我有以下表格:

forms.py
==============

class CustomerForm(ModelForm):

    class Meta:
        model       = Customer
        fields      = ["name"]

class CustomerServiceForm(ModelForm):

    class Meta:
        model       = customer_services
        fields      = ["service", "start", "end"]

class ServiceForm(ModelForm):

    class Meta:
        model       = Service
        fields      = ["name", "architecture"]


我试图有一个表单,我可以添加服务的客户,我遇到的问题是,该表单将只显示字段从CustomerServiceForm。我遇到的问题是,在服务表,我可以有多个服务具有相同的名称,但不同的架构,但是我没有办法在表单中显示它。所以假设我在Service表中有以下值:

services table
==============
id      ||      name        ||      architecture
1       ||      Test        ||      32Bit
2       ||      Test        ||      64Bit
3       ||      AnotherTest ||      32Bit
4       ||      AnotherTest ||      64bit
5       ||      TestTwo     ||      32Bit


本质上,我想做的是能够在表格中显示这样的东西

<select name="services" id="services">
  <option value="1">Test - 32Bit</option>
  <option value="2">Test - 64Bit</option>
  <option value="3">AnotherTest - 32Bit</option>
  <option value="4">AnotherTest - 64Bit</option>
  <option value="5">TestTwo - 32Bit</option>
</select>


我如何在select中显示架构,我无法找到一种方法让它显示在表单中,因为它不是模型的一部分。

eivgtgni

eivgtgni1#

如果我理解正确的话,那么我只需要在你的服务模型中添加一个额外的字段,它将合并的名称和架构字段组合在一起,并在表单中访问该字段。下面将添加一个保存方法,它将在你每次保存服务的模型示例时为你创建值。在模型下面添加__str__方法将告诉django,当引用这个模型时,它应该返回模型的这个方面。

class Service(models.Model):
    name = models.CharField(max_length=255, null=True, blank=True)
    architecture = models.CharField(max_length=255, null=True, blank=True)
    name_architecture = models.CharField(max_length=255, null=True, blank=True)

    def __str__(self):
        return self.name_architecture

    def save(self, *args, **kwargs):
        self.name_architecture = f'{self.name} - {self.architecture}'
        super(Service, self).save(*args, **kwargs)

字符串
对于表单,您只需引用customer_services中的service字段,然后您将获得一个已创建的名称和架构组合列表,并将两者都显示出来。

class CustomerServiceForm(ModelForm):

    class Meta:
        model = customer_services
        fields = ["service"]


根据您创建的服务名称和体系结构,完成后应类似于此。

u7up0aaq

u7up0aaq2#

只需使用模型的__str__魔术方法覆盖字符串表示,在本例中为Service

class Service(models.Model):
    ...

    def __str__(self):
        return f'{self.name} - {self.architecture}'

字符串

相关问题