@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.
Я пытался использовать рендеринг, но тоже не смог заставить его работать.
Какие-либо предложения? Я застрял на этом в течение нескольких часов и хочу пройти мимо.
Что касается return redirect
, это вполне возможно в Django-3.x: docs.djangoproject.com/en/dev/topics/http/shortcuts/#redirect
Попробуйте использовать 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, спасибо. кажется, это работает. Я буду больше читать о рендеринге и запросе, так как мне здесь не хватает понимания.
Рад помочь :)
Нет, это из
{% url 'board_topics' ... %}
, но где...
— несуществующая переменная, вероятно, вbase.html
.