【问题标题】:The model objects from django admin aren't connected to the backend model objects来自 django admin 的模型对象未连接到后端模型对象
【发布时间】:2022-01-23 09:23:35
【问题描述】:

所以我使用 5 美元的数字海洋水滴,使用 ubuntu 和 nginix 来托管一个 django 网站,我遵循了这个 this 教程和 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 repo 的媒体文件夹中没有显示任何新图像,包括从gunicorn --bind 0.0.0.0:8000 myproject.wsgi 上传的图像,它们只有我在本地开发时上传的图像

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

我有 2 个模型,这个问题似乎对他们来说都很普遍,我已经尝试过迁移,重新启动 ngnix 服务器,以及拉和推到 github,到目前为止都没有工作。 此外,新图片似乎确实存在于所需的网址中

这是我的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 告诉我问题是因为我没有运行 collect static 但我已经这样做了,这就是我的 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 有问题。

【问题讨论】:

  • @AnkitTiwari 这样做,即使我网站的 css 和 javascript 也被删除了,也没有解决问题
  • 您将静态文件目录命名为staticfiles,但在 nginx 配置中它仍被用作static。将root /home/apple/sanskar_handicrafts;替换为alias /home/apple/sanskar_handicrafts/staticfiles;重启nginx服务器,静态文件问题应该就没有了。 (root 指令 appends 也是位置部分。)
  • 能否包含整个 nginx 配置?其中一半丢失了。
  • 对不起,没有工作,Highlights.objects.all() 仍然显示 ]> 尽管管理页面中有 2 个其他人
  • 您的问题包含多个问题,nginx配置是第一个,我的建议应该解决静态文件问题。我正在调查查询问题。

标签: python django django-models django-views digital-ocean


【解决方案1】:

首先是静态文件问题:您将静态文件文件夹命名为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 变量,而不是创建新查询。所以它不会显示新添加的元素。

解决方法很简单:只需将所有内容移动到视图函数中,或者由视图函数调用的单独函数中。不要将任何动态的东西放到全局范围内,因为它只会在你启动或重启应用服务器时执行一次。

在此之后以及每次代码/settings.py/etc 更改之后,不要忘记通过调用重新启动 gunicorn 应用服务器:

sudo systemctl restart gunicorn.service

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2011-07-22
    • 1970-01-01
    相关资源
    最近更新 更多