来自 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 part,alias
没有。重新启动 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
,它会在代码更改时自动重启。但是在生产环境中你必须手动重启应用服务器。
所以我使用 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 part,alias
没有。重新启动 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
,它会在代码更改时自动重启。但是在生产环境中你必须手动重启应用服务器。