来自 django admin 的模型对象没有连接到后端模型对象

The model objects from django admin aren't connected to the backend model objects

所以我使用 ubuntu 和 nginix 的 5 美元数字海洋水滴来托管 django 网站,我遵循了这个 this tutorial and this 指南。所以指南的一部分从虚拟环境中对 运行 gunicorn --bind 0.0.0.0:8000 myproject.wsgi 说,它起作用了,作为测试,我创建了一个高亮对象,看看它是否会显示,它确实显示了,这就是它的样子:

编辑 3:服务文件

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=apple
Group=www-data
WorkingDirectory=/home/apple/sanskar_handicrafts
ExecStart=/home/apple/sanskar_handicrafts/env/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          sanskar_handicrafts.wsgi:application

[Install]
WantedBy=multi-user.target

之后我添加了一个 gunicorn 插座并完成了这篇文章,直到它告诉我 运行 sudo ufw allow 'Nginx Full',但是在我 运行 它之后,首先,管理页面的 css 不见了,但更令人担忧的是,在我从管理面板添加了一些额外的对象后,我的 views.py 似乎没有注意到这些更改,因为当我显示内容时Highlights.objects.all() 它只显示了上面的那个。但是管理页面确实显示对象已成功添加。 github 存储库的媒体文件夹也没有显示任何新图像,包括从 gunicorn --bind 0.0.0.0:8000 myproject.wsgi 上传的图像,它们只有我在本地开发时上传的图像

然而,当我 ls 从我的虚拟环境 运行ning nginix 进入媒体文件夹时,它包含我在本地上传的图像中的所有媒体文件以及所有新文件。

我有 2 个模型,这个问题似乎对它们都很普遍,我尝试了迁移,重新启动 ngnix 服务器,拉动和推送到 github,none 已经成功了远的。 此外,新图像似乎确实存在于所需的 url

这是我的 models.py:

from django.db import models

class Highlights(models.Model):
    img = models.ImageField(upload_to='highlights/')

class Gallery(models.Model):
    img = models.ImageField()

这是我的 views.py:

from django.shortcuts import render,get_object_or_404
from django.core.mail import send_mail
from .models import Gallery,Highlights


h_images = Highlights.objects.all()
g_images = Gallery.objects.all()

cnt = 1
rows = []
row = []
# Dividing the images into rows of 3 images per row as the maximum and creating a list of those rows
for image in g_images:
    if cnt < 3:
        row.append(image)
    else:
        row.append(image)
        cnt = 0
        rows.append(row)
        row = []
    cnt += 1

if row:
    rows.append(row)

# Seperating the rows into multiple pages to insure faster loading and better optimization
max_rows_per_page = 1
home_page = rows[:max_rows_per_page]
divided_rows_list = []
first = max_rows_per_page
last = max_rows_per_page + max_rows_per_page
curr_page = 1
for i in range(max_rows_per_page, len(rows), max_rows_per_page):
    divided_rows_list.append(rows[first:last])
    first = last
    last += max_rows_per_page


def home(request):
    return render(request, 'index.html',{'images':h_images})

def gallery(request):
    return render(request, 'gallery.html', {'rows':home_page,'nxt':1,'prev':len(divided_rows_list)})

    # return render(request,'gallery.html',{'rows':rows})

def nxt_pg(request,num):
    if num > len(divided_rows_list) or num == 0:
        return gallery(request)
    elif num < 0:
        num = len(divided_rows_list)
    return render(request, 'gallery.html', {'rows': divided_rows_list[num - 1], 'nxt': num + 1, 'prev': num - 1})

编辑:

所以 Ankit 告诉我问题是因为我没有 运行 收集静态但我已经这样做了,这就是我 settings.py 的静态部分的样子:

STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
]
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

这是我在 运行 sudo nano /etc/nginx/sites-available/myproject

时得到的

已编辑:

server {
    listen 80;
    server_name 139.59.20.1;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        alias /home/apple/sanskar_handicrafts/staticfiles;
    }

    location /media/ {
        root /home/apple/sanskar_handicrafts;
    }
    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

我也有一个 static_root 文件夹,这就是我现在尝试使用 collectstatic 时发生的情况:

所以我认为这不是 collectstatic 的问题。

首先是静态文件问题:您将静态文件文件夹命名为 staticfiles,但 URL 仍然是 static,因此 nginx 配置需要调整:

location /static/ {
    alias /home/apple/sanskar_handicrafts/staticfiles;
}

root 指令 appends the location partalias 没有。重新启动 nginx 以应用新配置。

让我们看看查询问题。当我们导入一个 Python 文件时,解释器会执行它的内容。因此,当您在 gunicorn 启动期间导入 views.py 时,它会立即执行 Highlights.objects.all() 等部分,将结果保存到 h_images 变量并移至下一行。

当您打开调用主页视图功能的网站主页面时,它将使用之前执行的h_images变量,而不是创建新的查询。所以它不会显示新添加的元素。

修复很简单:只需将所有内容移动到视图函数或由视图函数调用的单独函数中。不要将任何动态内容放入全局范围,因为它只会在您启动或重新启动时执行一次 app-server.

在那之后以及每次代码/settings.py/etc 更改之后,不要忘记通过调用重新启动 gunicorn app-server:

sudo systemctl restart gunicorn.service

在您的本地开发环境中,您在调试模式下启动 Django bultin runserver,它会在代码更改时自动重启。但是在生产环境中你必须手动重启应用服务器。