Django форма недействительна, но ошибка не отправляется - PullRequest
0 голосов
/ 18 февраля 2020

Я начал учиться Django сегодня, но я застрял в использовании форм. Я создал две формы: /contact и /blog-new. Форма на странице контактов работает нормально, но та, что на /blog-new, перенаправляет меня на домашнюю страницу после нажатия кнопки отправки, и никакая информация не печатается в терминале и не сохраняется в базе данных.

Код на Github

Я ценю, если кто-то может объяснить мне, что я сделал неправильно, так как я не могу понять это. Спасибо!

mysite / blog / forms.py

from django import forms

from .models import BlogPost

class BlogPostModelForm(forms.ModelForm):
    class Meta:
        model = BlogPost
        fields = ['title', 'slug', 'content']

mysite / blog / views.py

from .forms import BlogPostModelForm
def blog_post_create_view(request):
    # create objects
    # ? use a form
    # request.user -> return something
    form = BlogPostModelForm(request.POST or None)
    if form.is_valid():
        print(form.cleaned_data)
        form.save()
        form = BlogPostModelForm()
    template_name = 'form.html'
    context = {'form': form}
    return render(request, template_name, context)

mysite / blog / models.py

from django.db import models

# Create your models here.
class BlogPost(models.Model):
    title = models.TextField()
    slug = models.SlugField(unique=True)
    content = models.TextField(null=True, blank=True)

mysite / mysite / urls.py

from blog.views import (
    blog_post_create_view,
)

urlpatterns = [
    ..
    path('blog-new', blog_post_create_view),
    ..
]

mysite / templates / form. html

{% extends "base.html" %}



{% block content %}

{% if title %}
    <h1>{{ title }}</h1>
{% endif %}

<form method='POST' action='.'> {% csrf_token %}
    {{ form.as_p }}
    <button type='submit'>Send</button>
</form>


{% endblock %}

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Вам нужно указать вправо url в action атрибуте формы.

На самом деле это было не решение, а то, что помогло мне выяснить, в чем дело.

Нет необходимости указывать на /blog-new/, поскольку . для действия будет указывать на ту же страницу, но я пробовал использовать /blog-new/ в качестве URL-адреса действия, и я был удивлен, увидев, что /blog-new/ страница не существует.

Ошибка была в mysite / mysite / urls.py за отсутствие /:

path('blog-new', blog_post_create_view),

Это смешно (и раздражает) как такой символ, как /, отсутствующий в вашем коде, испортит все и заставит вас часами пытаться найти такое простое решение.

Спасибо, что потратили время на изучение моего код и попытайся мне помочь!

0 голосов
/ 18 февраля 2020

Вам нужно указать правильный URL в атрибуте action, равном form.

<form action="/blog-new/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>

Я думаю, что в вашем случае нет необходимости, но вы также можете изменить вид, чтобы он соответствовал документам .

from django.http import HttpResponseRedirect
from django.shortcuts import render

from .forms import SomeForm

def some_view(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = SomeForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            # ...
            # redirect to a new URL:
            return HttpResponseRedirect('/thanks/')

    # if a GET (or any other method) we'll create a blank form
    else:
        form = SomeForm()

    return render(request, 'template_name.html', {'form': form})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...