Пользовательская форма для создания и обновления блогов дает ошибку «Страница не найдена» - PullRequest
0 голосов
/ 27 июня 2019

Я создал простую форму для создания и обновления блогов. После создания вида обновления происходит что-то странное, что я не могу решить.

views.py

def createPost(request):
    if request.method == "POST":
        form = BlogPostForm(request.POST or None)
        if form.is_valid():
            new_post = form.save(commit=False)
            new_post.slug_post = slugify(new_post.title)
            new_post.save()
            return redirect('post_list')
    else:
        form = BlogPostForm()
    context = {
        'form': form,
        }
    template = 'blog/editing/create_post.html'
    return render(request, template, context)


def updatePost(request, slug_post=None):
    update_post = get_object_or_404(BlogPost, slug_post=slug_post)
    form = BlogPostForm(request.POST or None, instance=update_post)
    if form.is_valid():
        update_post = form.save(commit=False)
        update_post.slug_post = slugify(update_post.title)
        update_post.save()
        return redirect('post_list')

    context = {
        'form': form,
        }
    template = 'blog/editing/create_post.html'
    return render(request, template, context)

urls.py

urlpatterns = [
    path("blog/", views.listPost, name='post_list'),
    path("blog/<str:slug_post>/", views.singlePost, name='single_post'),

    path("blog/create-post/", views.createPost, name='create_post'),
    path("blog/<str:slug_post>/update-post/", views.updatePost, name='update_post'),
    path("blog/<str:slug_post>/delete-post/", views.deletePost, name='delete_post'),
]

post_list.html

  <div class="row">
    {% for post in post_list %}

      {% if forloop.first %}<div class="card-deck">{% endif %}
        <div class="card mb-3 shadow" style="max-width: 540px;">
          <div class="row no-gutters">
            <div class="col-md-4">
              <img src="{{ post.header_image_link }}" class="card-img" alt="{{ post.title }}" style="height: 250px;">
            </div>
            <div class="col-md-8">
              <div class="card-body">
                <h4 class="card-title"><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h4>
                <p class="card-text">{{ post.description }}</p>
                <p class="card-text my-0 py-0"><small class="text-muted"><strong>Published: </strong>{{ post.publishing_date|date }}</small></p>
              </div>
            </div>
          </div>
        </div>
      {% if forloop.counter|divisibleby:"4" or forloop.last %}</div>{% endif %}
      {% if forloop.counter|divisibleby:"4" and not forloop.last %}<div class="card-deck">{% endif %}

      {% empty %}

      <div class="row justify-content-md-center my-3 mx-1 py-2 shadow bg-danger rounded">
        <div class="col-md-auto">
          <h1 class="text-center px-2 py-2" id="text-shadow">Empty list!</h1>
        </div>
      </div>

    {% endfor %}
  </div>

create_post.html

<form class="" method="POST" enctype="multipart/form-data" novalidate>{% csrf_token %}

    <div class="form-group">

      <div class="row">
        <div class="col-sm-9">

          <div class="form-group mb-4">
            <div>{{ form.title }}</div>
            <label for="id_title">
              <span class="text-info" data-toggle="tooltip" title="{{ form.title.help_text }}">
                <i class="far fa-question-circle"></i>
              </span>
              <small class="text-danger">{{ form.title.errors }}</small>
            </label>
          </div>

          <div class="form-group mb-4">
            <div>{{ form.description }}</div>
            <label for="id_description">
              <span class="text-info" data-toggle="tooltip" data-placement="bottom" title="{{ form.description.help_text }}">
                <i class="far fa-question-circle"></i>
              </span>
              <small class="text-danger">{{ form.description.errors }}</small>
            </label>
          </div>

          <div class="form-group mb-4">
            <div>{{ form.contents }}</div>
            <label for="id_contents">
              <span class="text-info" data-toggle="tooltip" data-placement="bottom" title="{{ form.contents.help_text }}">
                <i class="far fa-question-circle"></i>
              </span>
              <small class="text-danger">{{ form.contents.errors }}</small>
            </label>
          </div>

          <div class="form-group mb-4">
            <div>{{ form.header_image_link }}</div>
            <label for="id_highlighted">
              <span class="text-info" data-toggle="tooltip" title="{{ form.header_image_link.help_text }}">
                <i class="far fa-question-circle"></i>
              </span>
              <small class="text-danger">{{ form.header_image_link.errors }}</small>
            </label>
          </div>

        </div>
        <div class="col-sm-3">

          <div class="form-inline mb-4 py-0">
            <div class="input-group mx-1">
              <label for="id_highlighted">{{ form.highlighted.label }}</label>
              <div class="ml-1">{{ form.highlighted }}</div>
            </div>

            <div class="input-group mx-1">
              <label for="id_draft">{{ form.draft.label }}</label>
              <div class="ml-1">{{ form.draft }}</div>
            </div>
          </div>

          <div class="form-group mb-4">
            <label for="publishing_date_field">
              {{ form.publishing_date.label }}
              <small class="text-danger">{{ form.publishing_date.errors }}</small>
            </label>
            <div class="input-group date" data-target-input="nearest">
              {{ form.publishing_date }}
              <div class="input-group-append" data-target="#publishing_date_field" data-toggle="datetimepicker">
                <div class="input-group-text"><i class="fa fa-calendar"></i></div>
              </div>
            </div>

            <script>
              $(function () {
                $("#publishing_date_field").datetimepicker({
                  format: 'DD/MM/YYYY HH:mm',
                });
              });
            </script>
          </div>

          <div class="form-group mb-4">
            <div class="row justify-content-md-center py-4 border border-warning rounded">
              <h5 class="text-justify px-3">Clicca sul tasto che segue per vedere l'elenco delle immagini. Potrai copiare il link all'immagine che ti interessa ed usarlo per creare l'immagine di testata o migliorare i contenuti del post.</h5>
              <button type="button" class="btn btn-primary mt-2 mx-2" data-toggle="modal" data-target=".bd-example-modal-xl">Image list</button>
            </div>


            <div class="modal fade bd-example-modal-xl" tabindex="-1" role="dialog" aria-labelledby="myExtraLargeModalLabel" aria-hidden="true">
              <div class="modal-dialog modal-xl modal-dialog-scrollable">
                <div class="modal-content">

                  <div class="modal-body">
                    {% for image in images_url_list %}

                      {% if forloop.first %}<div class="card-deck">{% endif %}
                        <div class="card mx-1 my-1" style="height: 100%; width: 300px;">
                          <img src="{{ image.file.url }}" class="card-img-top h-100" alt="{{ image.file.url }}" id="{{ image.id }}">
                          <div class="card-body">
                            <button class="btn btn-outline-primary btn-sm" type="button" onclick="CopyToClipboard('{{ image.id }}')">Copy URL</button>
                          </div>
                        </div>
                      {% if forloop.counter|divisibleby:"3" or forloop.last %}</div>{% endif %}
                      {% if forloop.counter|divisibleby:"3" and not forloop.last %}<div class="card-deck">{% endif %}

                    {% endfor %}
                  </div>

                  <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                  </div>

                </div>
              </div>
            </div>
          </div>

        </div>
      </div>

      <hr>

      <div class="row justify-content-md-center">
        <div class="col-md-auto">
          <input type="submit" class="btn btn-info" value="Pubblica">
        </div>
      </div>

    </div>

  </form>

У меня появляется это сообщение об ошибке, если я пытаюсь создать новое сообщение с моей формой:

Страница не найдена (404) Метод запроса: GET URL запроса: http://127.0.0.1:8000/blog/create-post/ Поднято: blog.views.singlePost

Как я уже сказал, это произошло после создания updatePost. Если я прокомментирую путь одного сообщения path("blog/<str:slug_post>/", views.singlePost, name='single_post'),, я могу создать сообщение без проблем.

Что я не так?

1 Ответ

1 голос
/ 28 июня 2019

Переместите path("blog/<str:slug_post>/", views.singlePost, name='single_post') вниз списка, под обновлением и удалите пути.

urlpatterns = [
    path("blog/", views.listPost, name='post_list'),
    path("blog/create-post/", views.createPost, name='create_post'),
    path("blog/<str:slug_post>/update-post/", views.updatePost, name='update_post'),
    path("blog/<str:slug_post>/delete-post/", views.deletePost, name='delete_post'),
path("blog/<str:slug_post>/", views.singlePost, name='single_post'),
]
...