即使使用 OneToOneField(用户),单个地址也链接到多个用户

Single Address Linked to Multiple Users Even when Using OneToOneField(User)

所以我遇到的问题是,当我为用户添加地址时,该地址也链接到所有其他用户。我也可以在我的管理界面中看到这个。

然后即使我以一个用户身份登录,编辑地址,我的第二个用户的地址也会更改。

任何 clues/hints 我的问题所在都非常感谢。谢谢!

models.py

from django.db import models
from django.conf import settings
from django.contrib.auth.models import User 
# Create your models here.

class UserAddress(models.Model):
    user = models.OneToOneField(User)
    address = models.CharField(max_length=120)
    address2 = models.CharField(max_length=120, null=True, blank=True)
    city = models.CharField(max_length=120)
    state = models.CharField(max_length=120)
    country = models.CharField(max_length=120)
    zipcode = models.CharField(max_length=25)
    phone =  models.CharField(max_length=120)
    shipping = models.BooleanField(default=True)
    billing = models.BooleanField(default=False)

    def __str__(self):
        return self.get_address()

    def get_address(self):
        return "%s, %s, %s, %s, %s" %(self.address, self.city, self.state, self.country, self.zipcode)

views.py

def edit_address(request):

    user = request.user
    address = UserAddress.objects.get(user=user) 

    form = UserAddressForm(request.POST or None, instance=address)

    if request.method == 'POST':
        if form.is_valid():
            user_address = form.save(commit=False)

            user_address.user = request.user
            user_address.save()

            return HttpResponseRedirect('%s'%(reverse('address')))

    context = {
        "form": form
    }

    return render(request, "edit_address.html", context)

def add_address(request):
    form = UserAddressForm(request.POST or None)

    if request.method == 'POST':
        if form.is_valid():
            user_address = form.save(commit=False)

            user_address.user = request.user
            user_address.save()

            return HttpResponseRedirect('%s'%(reverse('address')))

    context = {
        "form": form
    }

    return render(request, "add_address.html", context) 

问题出在那一行:

address = UserAddress.objects.get()

正如您在尝试检索地址时没有指定查询参数一样,Django 检索您在数据库中拥有的唯一地址(如果您有多个地址或没有地址,它将失败)。所以你总是在编辑同一个对象。

我猜你想做的是:

address = UserAddress.objects.get(user=user)

这将检索用户的地址。 假设用户确实有一个地址,如果他没有,它将失败。