Django 3 перенаправить с помощью pk в проверке формы

@MODS- Хотя об этом уже спрашивали здесь, я не могу найти подходящий ответ в Django 3, пожалуйста, прочитайте все, что я пробовал, прежде чем удалять

Преамбула: Я работаю над этим учебником, который преподается в Django 1, я следую ему, но вношу необходимые изменения для Django 3.

ВОПРОС: Я получаю сообщение об ошибке при загрузке моей страницы с формой на ней.

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 %}

urls.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'),
]

Forms.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']

просмотры.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})

Я считаю, что моя проблема связана с возвратом HttpResponseRedirect('/').

в туториале они используют редирект return redirect('board_topics', pk=board.pk)

Однако, насколько мне известно, это невозможно в django 3. Также, когда я просмотрел официальную документацию django 3.1 в формах, они также используют HttpResponseRedirect.

Я пытался использовать рендеринг, но тоже не смог заставить его работать.

Какие-либо предложения? Я застрял на этом в течение нескольких часов и хочу пройти мимо.

Нет, это из {% url 'board_topics' ... %}, но где ... — несуществующая переменная, вероятно, в base.html.

Willem Van Onsem 24.12.2020 16:29

Что касается return redirect, это вполне возможно в Django-3.x: docs.djangoproject.com/en/dev/topics/http/shortcuts/#redirec‌​t

Willem Van Onsem 24.12.2020 16:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
372
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте использовать reverse:

from django.shortcuts import reverse

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

Кстати, обычная переадресация тоже должна работать, попробуйте.

редактировать

вам действительно нужно передать board в качестве параметра в вашем контексте в представлении формы:

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

Хороший человек! Раньше у меня был правильный рендер, но я удалил его часть и забыл обновить снова. Мелкие ошибки вас достанут. Что касается первого перенаправления на board_topics, спасибо. кажется, это работает. Я буду больше читать о рендеринге и запросе, так как мне здесь не хватает понимания.

James_B 24.12.2020 16:38

Рад помочь :)

SLDem 24.12.2020 16:50

Другие вопросы по теме