【问题标题】:Django form doesn't show error on template pageDjango 表单在模板页面上不显示错误
【发布时间】:2020-03-20 09:49:12
【问题描述】:

我的代码和https://simpleisbetterthancomplex.com/series/2017/09/18/a-complete-beginners-guide-to-django-part-3.html#rendering-bootstrap-forms这个完全一样。但是当我点击模板中的“发布”按钮时,它会向我显示同一页面,而不会出现需要字段等错误。

在我的虚拟环境中, Python 3.7.4, Django 2.2.7 我已经安装了 Django-widgets-improved。

//查看

def new_topic(request, pk):
    board = get_object_or_404(Board, pk=pk)
    user = User.objects.first()

    if request.method == 'POST':
        form = NewTopicForm(request.POST)
        if form.is_valid():
            topic = form.save(commit=False)
            topic.board = board
            topic.starter = user
            topic.save()

            post = Post.objects.create(
                message = form.cleaned_data.get('message'),
                topic = topic,
                created_by = user
            )
            return redirect('board_topics', pk = board.pk)

    form = NewTopicForm()
    return render(request, 'new_topic.html', {'board': board, 'form': form})

//形成html

   <form method="post" novalidate>
            {% csrf_token %}
            {{ form.non_field_errors }}
            {{ form.errors }}
            {{ form.as_p }}

            <button type="submit" class="btn btn-success">Post</button>
        </form>

//models.py

from django.db import models
from django.contrib.auth.models import User


class Board(models.Model):
    name = models.CharField(max_length=25, unique=True)
    description = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Topic(models.Model):
    subject = models.CharField(max_length=255)
    last_updated = models.DateTimeField(auto_now_add=True)
    board = models.ForeignKey(Board, on_delete=models.CASCADE, related_name='topics')
    starter = models.ForeignKey(User, on_delete=models.CASCADE, related_name='topics')


class Post(models.Model):
    message = models.TextField(max_length=4000)
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE, related_name='posts')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(null=True)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
    updated_by = models.ForeignKey(User, null=True, on_delete=models.CASCADE, related_name='+')

//forms.py

from django import forms
from .models import Topic


class NewTopicForm(forms.ModelForm):
    message = forms.CharField(
        widget=forms.Textarea(
            attrs={'rows':5, 'placeholder':'What is in your mind?'}
        ), 
        max_length=4000,
        help_text='The max length of the text is 4000.')

    class Meta:
        model = Topic
        fields = ['subject', 'message']

//main/urls.py

from django.contrib import admin
from django.urls import path
from boards import views


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.home, name='home'),
    path('boards/<int:pk>/', views.board_topics, name='board_topics'),
    path('boards/<int:pk>/new/', views.new_topic, name='new_topic'),
]

【问题讨论】:

  • 你能添加一些你的视图和表单的代码吗?
  • 也发布您的模型、表单和网址代码
  • form = NewTopicForm()放在if request.method == 'POST':行之前
  • 你也可以像这样在控制台上看到你的表单错误print(form.errors.as_data())

标签: django django-forms django-templates django-widget-tweaks


【解决方案1】:

初始形式form = NewTopicForm() 必须在if request.method == 'POST': 之前或else: 条件中声明。在您的情况下,干净的表单总是到达模板。

def new_topic(request, pk):
    board = get_object_or_404(Board, pk=pk)
    user = User.objects.first()

    form = NewTopicForm()  # <---

    if request.method == 'POST':
        form = NewTopicForm(request.POST)
        if form.is_valid():
            topic = form.save(commit=False)
            topic.board = board
            topic.starter = user
            topic.save()

            post = Post.objects.create(
                message = form.cleaned_data.get('message'),
                topic = topic,
                created_by = user
            )
            return redirect('board_topics', pk = board.pk)

    return render(request, 'new_topic.html', {'board': board, 'form': form})

def new_topic(request, pk):
    board = get_object_or_404(Board, pk=pk)
    user = User.objects.first()

    if request.method == 'POST':
        form = NewTopicForm(request.POST)
        if form.is_valid():
            topic = form.save(commit=False)
            topic.board = board
            topic.starter = user
            topic.save()

            post = Post.objects.create(
                message = form.cleaned_data.get('message'),
                topic = topic,
                created_by = user
            )
            return redirect('board_topics', pk = board.pk)
    else:
        form = NewTopicForm()  # <---

    return render(request, 'new_topic.html', {'board': board, 'form': form})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多