Django 表单:'NoneType' 对象没有属性 'is_valid'

时间:2021-05-25 01:24:27

标签: python django

像这里的很多人一样,我必须处理表单问题,但即使有其他帖子我也看不到解决方案,这是我的文件:testeuh/models.py

from django.db import models
from django.contrib import admin

# Create your models here.
class diapo(models.Model):
    title = models.CharField(max_length=30)
    corpus = models.TextField(max_length=300)
    image = models.ImageField(upload_to="DossierImages")

class diapoAdmin(admin.ModelAdmin):
    search_fields = ['title']
    list_display = ['title']

testeuh/forms.py :

from django.forms import ModelForm

from .models import diapo

def DiapoForm(ModelForm):
    class Meta:
        model = diapo
        fields = [
            'title',
            'corpus',
            'image',
        ]

testeuh/views.py:

from django.shortcuts import render
from .forms import DiapoForm
from .models import diapo
# Create your views here.

def diapo_create_view(request):
    form = DiapoForm(request.POST or None)
    if form.is_valid():
        form.save()
    context = {
        'form': form
    }
    return render(request, "diapo/create.html", context)

def diapo_detail_view(request):
    obj = diapo.objects.get(id=1)
    context = {
        "object" : obj
    }
    return render(request, "diapo/detail.html", context)

urls.py:

"""SiteEcran URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from pages.views import home_view
from testeuh.views import diapo_detail_view
from testeuh.views import diapo_create_view

urlpatterns = [
    path('create/', diapo_create_view),
    path('admin/', admin.site.urls),
    path('', home_view, name='home'),
    path('diapo/', diapo_detail_view, name='diapo'),
]

testeuh/templates/diapo/create.html :

{% extends 'base.html' %}

{% block content %}

<form>
    {{ form.as_p }}
    <input type='submit' value='Save' />
</form>

{% endblock %}

这样做(在 ~2h08 复制本教程:https://www.youtube.com/watch?v=F5mRW0jo-U4)我收到以下错误:AttributeError at /create/ 'NoneType' 对象没有属性 'is_valid' 在 /home/raptorjesus/Desktop/SiteEcran/testeuh/views.py,第 8 行,在 diapo_create_view 我不明白为什么 DiapoForm(request.POST or None) 返回一个 None 对象。如果我有更多的“安全性”,通过引入这样的代码

    if request.method == 'POST':
        if form.is_valid():
            return HttpResponseRedirect('/thanks/')
    return render(request, 'my_template.html', {'form': form})

我不再崩溃,但网页呈现时没有任何入口区域,只有“保存”按钮。谁能救救我?

2 个答案:

答案 0 :(得分:0)

您的错误是针对 GET 请求,您的代码也在寻找已发布的表单。将您的 POST 请求与 GET 请求分开:

def diapo_create_view(request):
    
    if request.method=='POST':
        form = DiapoForm(request.POST)
        if form.is_valid():
            form.save()
    form = DiapoForm()
    context = {
        'form': form
    }
    return render(request, "diapo/create.html", context)

答案 1 :(得分:0)

我实在是太笨了。这是解决方案:

from django.forms import ModelForm

from .models import diapo

class DiapoForm(ModelForm): #put class instead of def...
    class Meta:
        model = diapo
        fields = [
            'title',
            'corpus',
            'image',
        ]