Моя форма модели для Django не сохраняется, потому что она недействительна, но я не вижу, что не так - PullRequest
0 голосов
/ 19 апреля 2019

Я очень новичок в Django, и часть задания заключалась в том, чтобы создать собственную форму блога. Я следовал предыдущим примерам учебника YouTube, но не смог создать свою собственную форму модели блога. Форма не будет сохранена, потому что она недействительна, и я два дня ломал голову, чтобы ее решить, но не могу найти, что не так.

Кроме того, каждый раз, когда я отправляю свою форму, она перенаправляет меня на другую страницу, которую я не совсем понимаю, почему.

Пожалуйста, помогите.

Я использую Django версии 2.0.7.

My models.py

from django.db import models

class Article(models.Model):
    title   = models.CharField(max_length=120) # Max length required
    content = models.TextField()
    active  = models.BooleanField(default=True)

My forms.py

from django import forms

from .models import Article

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = [
            'title',
            'content',
            'active'
        ]

my views.py

from django.shortcuts import render, get_object_or_404, redirect
from .forms import ArticleForm
from .models import Article

def article_list_view(request):
    print("this is article_list.html")
    queryset = Article.objects.all()
    context ={
        "object_list": queryset
    }
    return render(request, "blogs/article_list.html", context)

def article_create_view(request):
    form = ArticleForm(request.POST or None)
    print(ArticleForm.errors)
    if form.is_valid():
        print("Valid form")
        form.save()
    else:
        print("invalid")
        print(ArticleForm.errors)
    context = {
        "form": form
    }
    return render(request, "blogs/article_create.html", context)

article_create.html

{% extends 'base.html' %}

{% block content %}

    <form action='.' method='POST'>{% csrf_token %} 
        {{ form.as_p }}
        <input type='submit' value='Save'>
    </form>

{% endblock %}

urls.py

from django.contrib import admin
from django.urls import include, path

from pages.views import (
    home_view, 
    contact_view, 
    about_view, 
    social_view
    )

from blog.views import (
    article_list_view, 
    article_detail_view,
    article_create_view
    )

urlpatterns = [
    path('products/', include('products.urls')),

    path('', home_view, name='home'),
    path('contact/', contact_view, name='contact'),
    path('about/', about_view, name='product-detail'),
    path('social/', social_view, name='social'),
    path('admin/', admin.site.urls),

    #blog paths
    path('articles/', article_list_view, name = 'articles'),
    path('articles/detail/<int:id>', article_detail_view, name = 'article-detail'),
    path('articles/create', article_create_view, name = 'article-create'),

]

Это отображается в моей командной строке на моем сервере:

Django version 2.0.7, using settings 'trydjango.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
<property object at 0x000001ED94386458>
invalid
<property object at 0x000001ED94386458>
[18/Apr/2019 22:33:51] "GET /articles/create HTTP/1.1" 200 920
this is article_list.html
[18/Apr/2019 22:34:02] "POST /articles/ HTTP/1.1" 200 668

Как только я попадаю на article / create или article_create.html, появляется <property object at 0x000001ED94386458>.

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Ваша форма должна быть отправлена ​​на "", а не ".".

<form action='' method='POST'>{% csrf_token %} 

В качестве альтернативы / дополнительно, убедитесь, что вы изначально переходите на /articles/create/, а не /articles/create без окончательного слеша.(Хотя обычно встроенный CommonMiddleware позаботится о перенаправлении на путь с косой чертой - вы случайно установили для параметра APPEND_SLASH значение False? Не делать.)

0 голосов
/ 19 апреля 2019

1) Вы не должны использовать .errors в классе .

ArticleForm.errors

должно быть

form.errors

2) Вы должны разделить GET иPOST запросы на ваш взгляд.

def article_create_view(request):
    if request.method == "POST":
        form = ArticleForm(request.POST)            
        if form.is_valid():
            print("Valid form")
            form.save()
        else:
            print("Invalid form")
            print(form.errors)        
    else:
        form = ArticleForm()

    context = {"form": form)

    return render(request, "blogs/article_create.html", context)
...