Как я могу реализовать адресную форму в Django?Это то, что у меня есть - PullRequest
0 голосов
/ 09 февраля 2019

Привет, ребята. Я пытаюсь понять, как добавить несколько адресов пользователю.Таким образом, пользователь может иметь адреса доставки и домашние адреса.Я как-то догадывался, что читаю, но это не работает.

Я также создал простую схему (я забыл указать почтовый индекс):

Screen-Shot-2019-02-08-at-7-31-36-PM.png

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?

Может кто-нибудь помочь мне, пожалуйста?

Большое спасибо

1 Ответ

0 голосов
/ 09 февраля 2019

Сначала комментарий о вашем дизайне ...

Таким образом, у пользователя может быть много адресов, разница в том, что это может быть домашний адрес или адрес или адрес доставки.

Вы можете использовать ManyToManyField и «описать» отношения с помощью третьей модели, в которой будет указана информация о доставке или домашнем адресе.

Сначала я переименую ваш «HomeAddress»«Адрес», так что это более семантически, затем установите отношение, используя 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)

О создании форм ...

Затем можно написать форму для добавления адреса в некоторый профиль с учетом типа адреса.

Если вы хотитеЧтобы добавить несколько адресов одновременно, рекомендуется использовать FormSet или ModelFormSet .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...