Как запросить и опубликовать объект для поля foreignkey

Когда я делаю это точно так, как указано ниже, объект адреса доставки создается без клиента, назначенного в поле foreignkey адреса доставки, я могу добавить его из панели администратора вручную, но я не могу заставить его работать через код, не знаю, что я делаю неправильно, пожалуйста, помогите!

**models.py**

class Customer(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE, blank=True, null=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField(max_length=150)

class ShippingAddress(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, blank=True, null=True)
    order = models.ForeignKey(Order, on_delete=models.SET_NULL, blank=True, null=True)
    address_one = models.CharField(max_length=200)
    address_two = models.CharField(max_length=200)
    ...

**views.py**
    
def checkout(request):

    if request.user.is_authenticated:
        customer = request.user.customer
        order, created = Order.objects.get_or_create(customer=customer, complete=False)
        items = order.orderitem_set.all()
    else:
        items = []
        order = {'get_cart_total': 0, 'get_cart_items': 0}


    if request.method == 'POST':
        form = ShippingForm(request.POST)

        if form.is_valid():

            #how do I get the customer to get added in the foreignkey field for the shipping address model

            form.save()
            return redirect('store:checkout_shipping')
        else:
            form = ShippingForm()

    else:
        form = ShippingForm()

    context = {"items": items, "order": order, "form": form}
    return render(request, 'store/checkout.html', context)

В ответ на ваш комментарий #how do I get the customer to get added... и т.д., в случае, если ваш ShippingForm() указывает на вашу ShippingAddress модель, или, по крайней мере, что-то с полем внешнего ключа customer, вам может понадобиться сделать что-то вроде этого:

def checkout(request):

    if request.user.is_authenticated:
        customer = request.user.customer
        order, created = Order.objects.get_or_create(customer=customer, complete=False)
        items = order.orderitem_set.all()
    else:
        items = []
        order = {'get_cart_total': 0, 'get_cart_items': 0}


    if request.method == 'POST':
        form = ShippingForm(request.POST)

        if form.is_valid():
            new_shipment = form.save(commit=False)
            new_shipment.customer = customer
            new_shipment.save()
            return redirect('store:checkout_shipping')
        else:
            form = ShippingForm()

    else:
        form = ShippingForm()

    context = {"items": items, "order": order, "form": form}
    return render(request, 'store/checkout.html', context)   

Использование commit=False на form.save() позволит вам впоследствии изменять другие поля, в данном случае, добавляя отношение customer, а затем сохраняя его. Больше информации здесь в документации Django. Основная цитата:

Этот метод save() принимает необязательный аргумент ключевое слово commit, которое принимает значение True или False. Если вы вызовете метод save() с commit=False, то он вернет объект, который еще не был сохранен в базу данных. В этом случае вы сами должны вызвать save() для полученного экземпляра модели. Это полезно, если вы хотите выполнить пользовательскую обработку объект перед его сохранением, или если вы хотите использовать одну из commit по умолчанию имеет значение True.

"Пользовательская обработка" в данном случае - это создание отношения внешнего ключа к экземпляру модели (клиент).

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