django .urls.exceptions.NoReverseMatch: Реверс для 'new_entry' с аргументами '(1,)' не найден. Пробовали 1 шаблон (ы): ['new_entry / $'] - PullRequest
0 голосов
/ 29 мая 2020

В настоящее время я работаю над учебным пособием в книге «Python Cra sh курс».

Учебное пособие посвящено созданию веб-приложения «Журнал обучения» с помощью Django. Идея приложения состоит в том, чтобы позволить пользователям: 1. создавать «темы», о которых они узнали; 2. добавлять «записи» к этим темам, описывая детали, которые они узнали, c к этим темам

I в настоящее время я застрял при редактировании существующей формы ввода и получаю сообщение об ошибке, когда я запускаю http://127.0.0.1: 8000 / themes / 2 /

файл forms.py

    from django import forms
    from .models import Topic,Entry
    class Topicform(forms.ModelForm):
         class Meta:
         model = Topic
         fields =['text']
         labels = {'text' :''}
    class Entryform(forms.ModelForm):
        class Meta:
        model = Entry
        fields =['text']
        labels = {'text' :''}
        widgets = {'text' : forms.Textarea(attrs={'cols':80})}

файл urls.py

    from django.conf.urls import url
    from . import views
    app_name='learning_logs' 
    urlpatterns=[
      #Home page
    url(r'^$',views.index,name='index'),
      #Show all topics page
    url(r'^topics/$',views.topics,name='topics'), 
      #Detail page for a single topic
    url(r'^topics/(?P<topic_id>\d+)/$',views.topic,name='topic'),
      #Page for adding a new topic
    url(r'^new_topic/$',views.new_topic,name='new_topic'),
      #Page for adding a new entry
    url(r'^new_entry/$',views.new_entry,name='new_entry'),
      #Page for editing an entry
    url(r'^edit_entry/(?P<entry_id>\d+)/$',views.edit_entry,name='edit_entry'), 

]

файл views.py

    from django.http import HttpResponseRedirect
    from django.urls import reverse
    from django.shortcuts import render
    from .models import Topic,Entry 
    from .forms import Topicform, Entryform
    --snip--
    def edit_entry(request,entry_id):
        entry = Entry.objects.get(id=entry_id)
        topic=entry.topic

        if request.method != 'POST':
        # No data submitted; create a blank form
           form = Entryform(instance = entry)
        else:
        # Post data submitted;process data
           form = Entryform(request.POST,instance=entry)
           if form.is_valid():
                form.save()
        return HttpResponseRedirect(reverse('learning_logs:topics',args=[topic.id]))

   context={'entry':entry,'topic':topic,'form':form}
   return render(request,'learning_logs/edit_entry.html',context)

edit_entry. html файл

    {% extends "learning_logs/base.html" %}

    {% block content %}

    <p><a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a></p>

    <p>Edit Entry:</p>
    <form action= "{%url 'learning_logs:edit_entry' entry.id %}" method = 'post'>
        {%csrf_token %}
        {{form.as_p}}
    <button name="submit">save changes</button>
    </form>

   {% endblock content %}

topi c. html файл

    {% extends "learning_logs/base.html" %}

    {% block content %}
    <p> Topic: {{topic}} </p>
    <p> Entries:</p>
    <p>
       <a href="{% url 'learning_logs:new_entry' topic.id %}">Add new entry</a>
    </p>
    <ul>
         {%for entry in entries%}
       <li>
         <p> {{entry.date_added|date:'M d,Y H:i'}} </p>
         <p> {{entry.text|linebreaks}} </p>
         <p>
            <a href="{% url 'learning_logs:edit_entry' entry.id %}">edit entry</a>
         </p>
      </li>
  {%empty%}
      <li>
         There are no entries for this topic yet.
      </li>
 {% endfor %} 
 </ul>
{% endblock content %}

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Добавление к ответу Biplove: в вашем файле views.py ваш путь topics не принимает никаких параметров. Возможно, это была глупая опечатка из-за того, как вы назвали свой urls

Итак, если вы хотите вернуться к списку тем после редактирования, вам следует изменить

return HttpResponseRedirect(reverse('learning_logs:topics',args=[topic.id]))

на

return HttpResponseRedirect(reverse('learning_logs:topics')

Но если вы хотите вернуться в топи c, которые вы только что редактировали, вам следует сделать это тогда ...

return HttpResponseRedirect(reverse('learning_logs:topic',args=[topic.id]))
0 голосов
/ 29 мая 2020

Ваш new_entry путь не принимает какие-либо параметры, как из вашего urls.py. Но вы дали один, в topi c. html:

<a href="{% url 'learning_logs:new_entry' topic.id %}">Add new entry</a>

Здесь topic.id - это то, что вы дали. Но должно быть:

<a href="{% url 'learning_logs:new_entry' %}">Add new entry</a>

EDIT

Итак, я попытаюсь объяснить. Во-первых, позвольте вам увидеть URL-адрес для new_entry при регистрации в urls.py.

  #Page for adding a new topic
  url(r'^new_topic/$',views.new_topic,name='new_topic'),

Здесь вы не указали параметр для пути. Смотрите, первая часть пути. r'^new_topic/$'. И посмотрите свой URL-адрес, в котором вы указали параметр:

  #Page for editing an entry
  url(r'^edit_entry/(?P<entry_id>\d+)/$',views.edit_entry,name='edit_entry'), 

Теперь давайте посмотрим на первую часть r'^edit_entry/(?P<entry_id>\d+)/$', здесь вы можете увидеть параметр, т.е. (?P<entry_id>\d+) с именем, entry_id . Сравнивая оба URL-адреса, ваши практические URL-адреса будут выглядеть так:

  #For adding new topic
  www.example.com/new_topic/

  #For url with parameter
  www.example.com/edit_entry/1/   # 1 is entry_id, parameter for route edit_entry

Теперь , давайте войдем в ваш шаблон:

<a href="{% url 'learning_logs:new_entry' topic.id %}">Add new entry</a>

Смотрите, последняя часть в django тег url, т.е. topic.id. Поскольку в вашем urls.py вы не указали параметр new_entry . Итак, если вы дадите параметр URL-адресу, который не принимает параметр ( не принимает параметр, я имею в виду, что URL-адрес зарегистрирован, но параметр не установлен для них ), тогда полученный URL-адрес будет показано.

Надеюсь, теперь вы понимаете, о чем я говорю. Для более подробного объяснения того, что делать, вы можете увидеть второй ответ W-liamx . Взгляните на эту прекрасную документацию по URL django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...