【问题标题】:How can I implement the address form in django? This is what I have如何在 django 中实现地址表单?这就是我所拥有的
【发布时间】:2019-07-03 06:23:21
【问题描述】:

大家好,我正在研究如何向用户添加多个地址。所以用户可以有送货地址和家庭地址。我有点猜想阅读,但它不起作用。

我还创建了一个简单的模式(我忘了包括邮政编码):

models.py

class Address(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60, default="Miami")
    state = models.CharField(max_length=30, default="Florida")
    zipcode = models.CharField(max_length=5, default="33165")
    country = models.CharField(max_length=50)

    class Meta:
        verbose_name = 'Address'
        verbose_name_plural = 'Address'

    def __str__(self):
        return self.name

# All user data is/should be linked to this profile, so when user gets deleted, all data deletes as well
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    nick_name = models.CharField('Nick name', max_length=30, blank=True, default='')
    bio = models.TextField(max_length=500, blank=True)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')
    addresses = models.ManyToManyField(
        Address,
        through='AddressType',
        through_fields=('address', 'profile'),
    )

    # If we don't have this, it's going to say profile object only
    def __str__(self):
         return f'{self.user.username} Profile'  # it's going to print username Profile

    def save(self, *args, **kwargs):
            super().save(*args, **kwargs)

            img = Image.open(self.image.path)

            if img.height > 300 or img.width > 300:
                output_size = (300, 300)
                img.thumbnail(output_size)
                img.save(self.image.path)


class AddressType(models.Model):

    HOME_ADDRESS = 1
    SHIPPING_ADDRESS = 2

    TYPE_ADDRESS_CHOICES = (
        (HOME_ADDRESS, "Home address"),
        (SHIPPING_ADDRESS, "Shipping address"),
    )

    address = models.ForeignKey('Address', on_delete=models.CASCADE)
    profile = models.ForeignKey('Profile', on_delete=models.CASCADE)

    # This is the field you would use for know the type of address.
    address_type = models.PositiveIntegerField(choices=TYPE_ADDRESS_CHOICES)


当我进行迁移时,它会说:

ERRORS:
users.Profile.addresses: (fields.E339) 'AddressType.address' is not a foreign key to 'Profile'.
        HINT: Did you mean one of the following foreign keys to 'Profile': profile?
users.Profile.addresses: (fields.E339) 'AddressType.profile' is not a foreign key to 'Address'.
        HINT: Did you mean one of the following foreign keys to 'Address': address?

有人可以帮帮我吗?

非常感谢

【问题讨论】:

    标签: python django django-models django-forms django-views


    【解决方案1】:

    首先对您的设计发表评论...

    所以一个用户可以有许多个地址,区别在于可以是家庭地址或地址或送货地址。

    您可以使用ManyToManyField 并通过第三个模型“描述”这种关系,该模型将包含运输或家庭地址的信息。

    首先,我会将您的“HomeAddress”重命名为“Address”,这样更符合语义,然后使用through 与第三个表建立关系。

    阅读ManyToManyFiled 文档了解更多详情。

    例子:

    class Address(models.Model):
        # ...
    
    class Profile(models.Model):
        addresses = models.ManyToManyField(
             'Address', 
             through='AddressInfo'
             through_fields=('address', 'profile')
        )
        # ...
    
    class AddressInfo(models.Model):
    
        HOME_ADDRESS = 1
        SHIPPING_ADDRESS = 2
    
        TYPE_ADDRESS_CHOICES = (
            (HOME_ADDRESS, "Home address"),
            (SHIPPIN_ADDRESS, "Shipping address"),
        )
    
        address = models.ForeignKey('Address', on_delete=models.CASCADE)
        profile = models.ForeignKey('Profile', on_delete=models.CASCADE)
    
        # This is the field you would use for know the type of address.
        address_type = models.PositiveIntegerField(choices=TYPE_ADDRESS_CHOICES)
    

    关于创建表单...

    然后,您可以编写表单以将地址添加到某些配置文件,同时考虑地址类型。

    如果要同时添加多个地址,建议使用FormSetModelFormSet

    【讨论】:

    • 哇,这是另一个级别的模型,哈哈,谢谢雷,问题,我如何在 views.py 中调用表单/模型?因为使用 Profile 模型很容易:instance=request.user.profile 但我如何在不是那个模型的新模型中做到这一点?感谢您的帮助,我每天都更爱 Django
    • 没关系,我想我明白了,我现在病了,所以明天当我感觉好些时,我会试一试。这里解释了你在说什么docs.djangoproject.com/en/2.1/topics/db/models/…,明天我会试一试
    • 很高兴为您提供帮助,如果遇到困难随时回来。
    • 早上好 Ray,我现在正尝试这样做,但在 through_fields=('address', 'profile') 行出现错误,它显示 SyntaxError: invalid syntax。我更新了上面的代码,这样你就可以确切地看到我是如何拥有它的 :)
    • Lo reviso hoy en la noche。
    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2020-01-15
    相关资源
    最近更新 更多