данные администратора django не регистрируются в базе данных

Я создаю веб-сайт электронной коммерции с Django и испытываю некоторые трудности с передачей данных со страницы администратора в базу данных, а затем в html. Я новичок в Django, и мне бы очень понравилась ваша помощь. Я добавил 7 продуктов (класс Product) через страницу администратора Django.

модели.py

from django.db import models
from django.contrib.auth.models import User


class Customer(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True)
    name = models.CharField(max_length=200, null=True)
    email = models.CharField(max_length=200, null=True)

    def __str__(self):
        return self.name


class Product(models.Model):
    name = models.CharField(max_length=200)
    price = models.FloatField()
    
    def __str__(self):
        return self.name


class Order(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True, blank=True)
    date_ordered = models.DateTimeField(auto_now_add=True)
    complete = models.BooleanField(default=False)
    transaction_id = models.CharField(max_length=100, null=True)

    def __str__(self):
        return str(self.id)


class OrderItem(models.Model):
    product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
    order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True)
    quantity = models.IntegerField(default=0, null=True, blank=True)
    date_added = models.DateTimeField(auto_now_add=True)


class ShippingAddress(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True)
    order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True)
    address = models.CharField(max_length=200, null=False)
    city = models.CharField(max_length=100, null=False)
    country = models.CharField(max_length=100, null=False)
    postcode = models.CharField(max_length=100, null=False)
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.address


просмотры.py

from django.shortcuts import render
from .models import *


def products(request):
    products = Product.objects.all()
    context = {'products':products}
    return render(request, 'store/products.html')


def cart(request):
    context = {}
    return render(request, 'store/cart.html')


def checkout(request):
    context = {}
    return render(request, 'store/checkout.html')


def home(request):
    context = {}
    return render(request, 'store/home.html')


admin.py

from django.contrib import admin
from .models import *

admin.site.register(Customer)
admin.site.register(Product)
admin.site.register(Order)
admin.site.register(OrderItem)
admin.site.register(ShippingAddress)

В settings.py база данных по умолчанию — sqlite3.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

Снимок экрана страницы администрирования Django с успешно добавленными продуктами

Я выполнил миграцию, и база данных db.sqlite3 выходит из папки моего проекта.

Однако, когда я проверяю значения таблицы store_product, она кажется пустой...

быстрый


SQLite version 3.33.0 2020-08-14 13:23:32
Enter ".help" for usage hints.
sqlite> .width
sqlite> .mode markdown
sqlite> select * from store_product
   ...>


На моей html-странице, где я хочу отображать продукты, ничего не отображается... Переменная products пуста:

продукты.html

        {% if products is defined %}
            value of variable: {{ products }}
        {% else %}
            variable is not defined
        {% endif %}

ничего не показывает...

Большое спасибо за твою помощь.


person AlexisLP    schedule 03.03.2021    source источник
comment
Если они отображаются в пользовательском интерфейсе администратора, но не когда вы вручную открываете БД в терминале, то я предполагаю, что вы каким-то образом просматриваете 2 разных БД sqllite - приложение django использует один, а ваш терминал использует другой.   -  person Tom Dalton    schedule 03.03.2021


Ответы (2)


Вы никогда не передаете контекст своему представлению. Это должно быть так:

def products(request):
    products = Product.objects.all()
    context = {'products':products}
    return render(request, 'store/products.html', context)

Кроме того, что {% if products is defined %} не имело бы никакого смысла. Так что просто визуализируйте продукты:

{% for product in products %}
    Product: {{ product.name }}
    Price: {{ product.price }}
{% empty %}
    No products to display!
{% endfor %}
person Abdul Aziz Barkat    schedule 03.03.2021
comment
Теперь, когда контекст передан, все работает нормально. Спасибо. - person AlexisLP; 03.03.2021

Код вашего шаблона выглядит неправильно — is defined не является python.

Достаточно следующего:

{% if products %}
<ul>
    {% for product in products %}
    <li>{{ product.name }}: {{ product.price }}
    {% endfor %}
</ul>
{% else %}
    No products.
{% endif %}

Администратор Django точно показывает все, что находится в подключенной базе данных, кеша нет.

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

Возможно, вы захотите начать использовать базу данных, которую планируете использовать в производственной среде, чтобы исключить эти проблемы и быть ближе к вашей производственной настройке при разработке.

person Risadinha    schedule 03.03.2021