django 3在表单验证中使用pk重定向

标签 django django-3.1

@MODS-虽然之前已经有人问过我在 Django 3 中找不到合适的答案,但请在删除之前通读我尝试过的所有内容

序言: 我正在通过This Tutorial工作这是 Django 1 中教授的,我正在遵循它,但对 Django 3 进行了必要的更改。

问题: 我在加载带有表单的页面时收到错误。 enter image description here

表单页面的 HTML:


{% block title %}Start a New Topic{% endblock %}

{% block breadcrumb %}
  <li class="breadcrumb-item"><a href="{% url 'home' %}">Boards</a></li>
  <li class="breadcrumb-item"><a href="{% url 'board_topics' board.pk %}">{{ board.name }}</a></li>
  <li class="breadcrumb-item active">New topic</li>
{% endblock %}

{% block content %}
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="btn btn-success">Post</button>
  </form>
{% endblock %}

基本 HTML:

{% block title %}Start a New Topic{% endblock %}

{% block breadcrumb %}
  <li class="breadcrumb-item"><a href="{% url 'home' %}">Boards</a></li>
  <li class="breadcrumb-item"><a href="{% url 'board_topics' board.pk %}">{{ board.name }}</a></li>
  <li class="breadcrumb-item active">New topic</li>
{% endblock %}

{% block content %}
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="btn btn-success">Post</button>
  </form>
{% endblock %}

url.py

from django.contrib import admin
from django.urls import path , re_path
#uses path and re_path for regex when needed.


from boards import views

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('boards/(?P<pk>\d+)/$', views.board_topics, name='board_topics'),
    re_path('boards/(?P<pk>\d+)/new/$', views.new_topic, name='new_topic'),
    path('', views.home,name='home'),
]

表单.py

from .models import Topic

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

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

View .py

from .models import Board, Topic, Post
from django.contrib.auth.models import User
from .forms import NewTopicForm
from django.http import HttpResponseRedirect

# Create your views here.
def home(request):
    boards = Board.objects.all()
    return render(request, 'home.html', {'boards': boards})

    
def board_topics(request, pk):
    try:
        board = Board.objects.get(pk=pk)
    except Board.DoesNotExist:
        raise Http404
    
    return render(request, 'topics.html', {'board': board})


def new_topic(request, pk):
    board = Board.objects.get(pk=pk)
    user = User.objects.first()  # TODO: get the currently logged in user

    if request.method == 'POST':
        form = NewTopicForm(request.POST)
        if form.is_valid():
            topic = form.save()
            return HttpResponseRedirect('/')

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

我相信我的问题来自 return HttpResponseRedirect('/')。

在教程中他们使用重定向 返回重定向('board_topics', pk=board.pk)

但是据我所知,这在 django 3 中是不可能的。此外,当我查看表单中的官方 django 3.1 文档时,他们也使用 HttpResponseRedirect。

我尝试过使用渲染,但也无法使其工作。

有什么建议吗?我已经被这个问题困扰了几个小时,并且想克服它。

最佳答案

尝试使用反向:

from django.shortcuts import reverse

... your form ...
return redirect(reverse('board_topics', kwargs={'pk': board.pk}))

顺便说一句,常规重定向也应该有效,请尝试一下。

编辑

您实际上需要在表单 View 的上下文中将 board 作为参数传递:

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

关于django 3在表单验证中使用pk重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65440263/

相关文章:

python - django 1.3 - 为基于类的 View 定义可选参数的正确方法

python - 有没有一种类似于这种方式的方法来在 django 中保存文件(.docx、pdf...)?

python - 将 Django channel 与现有 Django 3.1 wsgi 代码集成时出错

python - 意外错误 : replace() takes 2 positional arguments but 3 were given

python-3.x - django-microsoft-auth : The provided value for the input parameter 'redirect_uri' is not valid

python - Django 唯一随机作为默认值

css - django 联合提要框架 : adding CSS to RSS

Django 模板 for 循环并显示前 X 个匹配项

django 3.1 将原始列别名传递给 QuerySet.order_by() 已弃用