Как включить модель адреса в модель профиля (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})
Любая помощь будет высоко оценена, мне действительно нужно навести порядок в этом беспорядке. Если вам нужна дополнительная информация, чтобы ответить на вопрос, я с радостью ее предоставлю.
Спасибо!!!