#python #django #django-forms
#python #django #django-forms
Вопрос:
Я новичок и пытаюсь сделать что-то довольно простое после прочтения документации проекта Django Doc, но, похоже, не могу в этом разобраться. Я получаю имя пользователя с сообщением и пытаюсь получить его и отобразить на той же странице. Я получаю сообщение об ошибке: в hello () отсутствует 1 требуемый позиционный аргумент: ‘greeting_id’
Я использую Django 2 и задаюсь вопросом, может ли это быть связано с маршрутизацией? Я не совсем уверен, поскольку я очень новичок в MVC и Django.
Любая помощь в правильном направлении была бы высоко оценена.
Вот мой код на данный момент:
Views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import Greeting
# create hello view
def hello(request, greeting_id):
if request.method == 'POST':
if request.POST['firstname']:
greeting = models.Greeting()
greeting.firstname = request.POST['firstname']
greeting.save()
obj = models.Greeting.objects.get(pk=greeting_id)
context = {
'object': obj
}
return render(request, 'greetings/home.html', context)
return render(request, 'greetings/home.html')
Models.py
from django.db import models
# Create your models here.
class Greeting(models.Model):
firstname = models.CharField(max_length=100)
# returns post object in admin interface
def __str__(self):
return self.firstname
urls.py
from django.contrib import admin
from django.urls import path
from greetings import views #import greetings views into the url file
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', views.hello, name='hello'),
]
home.html
{% block content %}
<h2>Let's Say Hello!</h2>
<br/>
<br/>
<div>
<form method="POST" action="{% url 'hello' %}">
{% csrf_token %}
Enter your first name:
<br />
<input type="text" name="firstname" />
<br />
<br />
<input type="submit">
</form>
{{ object.firstname }}
</div>
{% endblock %}
Комментарии:
1. Я не просматривал большую часть кода, но, просто взглянув на сообщение об ошибке и две соответствующие части кода, становится ясно, что вы объявили второй параметр (отличный от
request
) дляhello
представления, но у вас нет параметра в соответствующем URL. Это не имеет смысла, и именно на это жалуется Django. Если вы хотите, чтобы ответ зависел от значенияgreeting_id
, вам нужно предоставить его в запросе — это означает либо как частьPOST
данных, либо как часть URL.
Ответ №1:
Для вашего представления «hello» требуется параметр «greeting_id»
def hello(request, greeting_id):
Эти параметры передаются из маршрутизации URL в представление, для работы представления ваш URL должен выглядеть следующим образом
path('hello/<int:greeting_id>/', views.hello, name='hello'),
Откуда должен поступать greeting_id?
Комментарии:
1. Привет @Iain, спасибо. После использования вашего кода я теперь получаю сообщение: Используя URLconf, определенный в greetingproject.urls, Django попробовал эти шаблоны URL в таком порядке: admin / hello /<int:greeting_id> / [name=’hello’] Текущий путь, hello / , не соответствует ни одному из них.
2. Вам следует удалить greeting_id из URL-адреса и из вашего представления
3. Похоже, вы добавили путь, указанный в ответе, в конец
/admin
маршрута, вместо того, чтобы заменить/hello
тот, который был задуман. (Либо это, либо вы добавили этот маршрут вadmin.site.urls
, что кажется маловероятным.)