Проблема с получением пользовательского ввода в Django

#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 , что кажется маловероятным.)