繁体   English   中英

Django 文件不保存

[英]Django Files doesn't save

我想做一个 django 项目,您可以在其中上传图像,并且该图像显示在另一个页面上。 我只能用管理面板编辑它。

这是代码:

视图.py

def home(request):
    all1 = New.objects.filter(username='mynameis12').all()
    if not request.user.is_authenticated:
        return redirect('/login/')
    return render(request, 'home.html',{'alls':all1})

模型.py

class New(models.Model):
    username = models.CharField(max_length=200)
    image = models.ImageField(upload_to='media')

表格.py


class New1(ModelForm):
    username = forms.CharField(max_length=200)
    image = forms.ImageField(required=False)
    class Meta:
        model = New
        fields = ['username','image']

设置.py

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
CRISPY_TEMPLATE_PACK = 'bootstrap4'
LOGIN_URL = '/b/'
LOGIN_REDIRECT_URL = '/b/'
LOGOUT_REDIRECT_URL = '/'

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

图像已显示,但未保存。

我应该怎么办?

谢谢。

您需要在视图中导入表单,并且需要将表单保存在视图中:

from forms import New1

def home(request):
    if not request.user.is_authenticated:
        return redirect('/login/')
    all1 = New.objects.filter(username='mynameis12').all()
    form = New1()
    if request.method == "POST":
        form = New1(request.POST)
        form.save()
    return render(request, 'home.html',{'alls':all1,'form':form})

在您的 HTML 中:

<form>
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Save</button>
</form>

按照此链接获取教程: https ://tutorial.djangogirls.org/en/django_forms/

如果要上传主页中的图片,则必须将表单传递给它

视图.py

from django.contrib.auth.decorators import login_required

# if you just want to display the images in the home page
from .models import New
@login_required(login_url="login") # this does the same thing as the if statement but better
def home(request):
    all1 = New.objects.filter(username='mynameis12')# no need for the '.all()'
    return render(request, "home.html", {"all1": all1 })

如果您只是在编辑管理面板,则无需使用该表单,但如果您仍想在这里使用它。

视图.py

from django.contrib.auth.decorators import login_required
from .forms import NewForm
@login_required(login_url="login") # this does the same thing as the if statement but better
def home(request):
    form = NewForm()
    if request.method == "POST":
        form = NewForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            ...
    return render(request, "home.html", {"form": form})

表格.py

class NewForm(ModelForm):
    class Meta:
        model = New
        fields = ['username','image']

    def __init__(self, *args, **kwargs):
        super(NewForm, self).__init__(*args, **kwargs)
        for name, field in self.fields.items():
            field.widget.attrs.update({'class': "input"})

如果您不更改模型的 models.py 定义中的任何内容,则无需在此处重新定义字段。

编辑

点安装白噪声枕头

设置.py

MIDDLEWARE = [
... 
    "whitenoise.middleware.WhiteNoiseMiddleware",
... ]

.... 
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.0/howto/static-files/
# STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"

STATIC_URL = "/static/"
# start
MEDIA_URL = "/images/"

STATICFILES_DIRS = [BASE_DIR / "static"]
MEDIA_ROOT = BASE_DIR / "static/images"
STATIC_ROOT = BASE_DIR / "staticfiles"
### end
from django.conf import settings
from django.conf.urls.static import static
...
urlpatterns = [....]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM