【问题标题】:I can't post in Django我不能在 Django 中发帖
【发布时间】:2021-06-08 20:39:04
【问题描述】:

我不能在 Django 中发帖,因为当我导入图像时它对我不起作用。它告诉我没有选择文件,但我选择了一个。

这是我创建的post模型,models.py文件:

class Post(models.Model):
    publisher = models.ForeignKey(User,on_delete=models.CASCADE)
    caption = models.CharField(max_length=100)
    date_created = models.DateTimeField(default=timezone.now())
    image = models.ImageField(upload_to="post_images")
    def __str__(self):
        return self.caption

这是 Post 模型的 forms.py 文件:

from django import forms
from .models import Post

class CreatePostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['caption','image']

这是 views.py 文件中的 Publish 函数,它实现了我的发布功能的逻辑:

@login_required
def Publish(request):
    if request.method == "POST":
        form = CreatePostForm(request.POST,request.FILES)
        if form.is_valid():
            form.publisher = request.user
            form.save()
            return redirect("home")
    else:
        form = CreatePostForm()

    return render(request,"posts/publish.html",{
       "form":form,
    })

int urls.py 文件:

from django.urls import path
from . import views
urlpatterns = [
    path('publish/',views.Publish,name="publish"),
    path('',views.home,name="home"),
]

这里是html模板:

{% extends "users/base.html" %}
{% load crispy_forms_tags %}
{% block title %}create{% endblock title%}

{% block content %}
    <div class="container-fluid">
        <div class="row">
            <div class="col-sm-6 col-md-5 authentification">
                <div class="form-header">
                    <h1>
                        publish
                    </h1>
                </div>
                <div class="form-body">
                    <form method="POST">

                        <fieldset class="form-group" enctype="multipart/form-data">
                            {% csrf_token %}
                            {{ form|crispy }}
                        </fieldset>
                        <div class="form-group">
                            <button type="submit" class="btn btn-primary form-control">publish</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
{% endblock content %}

使用的 Django 版本是 2.2 和 Python 3.8。和 Windows 10 专业版

【问题讨论】:

  • 该东西没有保存在数据库中,当我尝试发布图像时,我选择它并写入,当我点击发布时它告诉我没有选择图像。
  • 这是因为 HTML 表单中缺少 enctype

标签: django web django-models django-forms


【解决方案1】:

您应该更改包裹在form 中的.instance.publisher 属性,而不是表单本身,所以:

@login_required
def Publish(request):
    if request.method == 'POST':
        form = CreatePostForm(request.POST,request.FILES)
        if form.is_valid():
            form.instance.publisher = request.user
            form.save()
            return redirect('home')
    else:
        form = CreatePostForm()

    return render(request,'posts/publish.html',{
       'form': form,
    })

由于您同时提交文件和数据,您应该在&lt;form&gt; 中指定enctype=… attribute [mdn]

<form enctype="multipart/form-data" method="POST">
    …
</form>

注意:Django 的DateTimeField [Django-doc] 有一个auto_now_add=… parameter [Django-doc] 使用时间戳。这将自动分配当前日期时间 创建对象时,将其标记为不可编辑(editable=False),例如 默认不会出现在ModelForms 中。


注意:通常使用settings.AUTH_USER_MODEL [Django-doc] 引用用户模型比直接使用User model [Django-doc] 更好。更多信息可以查看referencing the User model section of the documentation

【讨论】:

    猜你喜欢
    • 2014-04-27
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多