Как включить модель адреса в модель профиля (Django)

Я пытаюсь понять, как мне следует структурировать мое приложение, и некоторые вещи работают не так, как ожидалось.

Я работаю над формой, которая должна позволить пользователю установить адрес выставления счета (возможно, также адрес доставки). К сожалению, если я включаю опцию billing address в форму профиля, она позволяет пользователю выбирать из всех адресов в базе данных, в том числе и от других пользователей.

Если я опущу это, адрес, который вводит пользователь, сохраняется в базе данных, но он не связан с пользователем, и каждый раз, когда пользователь обновляет форму, он снова сохраняет адрес.

Что я хочу:

  • Адрес сохраняется по отношению к пользователю
  • Адреса не являются избыточными
  • Пользователи не должны иметь возможность видеть адрес другого пользователя

Ниже я прикреплю фрагменты, которые, по моему мнению, являются релевантными. Я не уверен, нужно ли и как изменить функцию views, чтобы сохранить ввод от адреса выставления счетов по отношению к моему пользователю, или я должен изменить модели, чего я предпочел бы избежать, потому что я хочу сохранить их простыми.

forms.py
...
class ProfileEditForm(forms.ModelForm):
    date_of_birth = forms.DateInput()

    class Meta:
        model = Profile
        fields = ('date_of_birth', 'biography', 'description')  


class AddressUSEditForm(forms.ModelForm):
    class Meta:
        model = AddressUS
        fields = ('name', 'address_one', 'address_two', 'city', 'state', 'zipcode')
models.py

... # includes import of AddressUS Model

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    date_of_birth = models.DateField(blank=True, null=True)
    address_billing = models.OneToOneField(AddressUS, null=True, blank=True,
                                           on_delete=models.CASCADE, related_name='billing')
    #  address_shipping = models.OneToOneField(AddressUS, null=True, blank=True,
    #                                        on_delete=models.CASCADE, related_name='shipping')
    biography = models.CharField(max_length=300, null=True, blank=True)
    description = models.CharField(max_length=2000, null=True, blank=True)

    def __str__(self):
        return f'{self.user.username} Profile'

    def save(self, *args, **kwargs):
        super().save()
someroute/models.py
...
class AddressUS(models.Model):
    name = models.CharField(max_length=400, null=True, blank=True)
    address_one = models.CharField(max_length=300)
    address_two = models.CharField(max_length=300)
    city = models.CharField(max_length=200)
    state = models.CharField(max_length=2)
    zipcode = models.IntegerField()

    def __str__(self):
        return self.address_one + ' ' + self.address_two + ' ' + self.city + ', ' + self.state

    def save(self, *args, **kwargs):
        super().save()
views.py
...
@login_required
def edit(request):
    if request.method == 'POST':
        user_form = UserEditForm(instance=request.user,
                                 data=request.POST)
        profile_form = ProfileEditForm(instance=request.user.profile,
                                       data=request.POST,
                                       files=request.FILES)
        address_form_billing = AddressUSEditForm(instance=request.user.profile.address_billing,
                                                 data=request.POST)
        if user_form.is_valid() and profile_form.is_valid() and address_form_billing.is_valid():
            user_form.save()
            profile_form.save()
            address_form_billing.save()
            messages.success(request, 'Profile updated successfully')
        else:
            messages.error(request, 'Error updating your profile')
    else:
        user_form = UserEditForm(instance=request.user)
        profile_form = ProfileEditForm(instance=request.user.profile)
        address_form_billing = AddressUSEditForm(instance=request.user.profile.address_billing)
    return render(request,
                  'users/edit.html',
                  {'user_form': user_form,
                   'profile_form': profile_form,
                   'address_form_billing': address_form_billing})

Любая помощь будет высоко оценена, мне действительно нужно навести порядок в этом беспорядке. Если вам нужна дополнительная информация, чтобы ответить на вопрос, я с радостью ее предоставлю.

Спасибо!!!

Вернуться на верх