NoReverseMatch (django НЕПРАВИЛЬНЫЙ поиск URL) - PullRequest
0 голосов
/ 05 июля 2018

Новый для Джанго. Использование общих представлений на основе классов для «создания» новых песен и добавления их в базу данных.

Похоже, неправильный поиск по URL. Я благодарен за помощь.

urls.py (посмотрите последний URL - там, где произошла ошибка)

from django.conf.urls import url

import views
app_name= 'music'  # required for namespace
urlpatterns= [
  #/music/
  url(r'^$', views.index, name='index'),

  #/music/register
  url(r'^register/$', views.UserFormView.as_view(), name='register'),

  # /music/71/
  url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),

  #/music/album/add/
  url(r'album/add/$', views.AlbumCreate.as_view(), name='album-add'),

  #/music/album/2/
  url(r'album/(?P<pk>[0-9]+)/$',views.AlbumUpdate.as_view(), name='album-update'),

  #/music/album/2/delete/
  url(r'album/(?P<pk>[0-9]+)/delete/$',views.AlbumDelete.as_view(), name='album-delete'),

  #/music/login/
  url(r'^login/$',views.LoginView.as_view(), name='login'),

  #/music/logout/
  url(r'^logout/$',views.logout_user,name='logout'),

  #/music/songs/all/
  url(r'^songs/(?P<filter_by>[a-zA_Z]+)/$', views.songs, name='songs'),

  #/music/71/add/
  url(r'^(?P<pk>[0-9]+)/add/$', views.SongCreate.as_view(), name='song-add'),
]

Попытка перейти к / music // add / url для создания новой песни. Ошибка показывает отсутствие аргумента в URL детализации.

views.py

class DetailView(LoginRequiredMixin, generic.DetailView):
    login_url= 'music:login'
    redirect_field_name= 'go_to'
    model= Album
    template_name= 'music/detail.html'


class SongCreate(LoginRequiredMixin, CreateView):

    login_url='music:login'
    redirect_field_name='go_to'
    model=Song
    fields=['song_title','audio_file']

    def form_valid(self, form):
        temp= form.save(commit=False)
        temp.album= self.request.album
        temp.save()
        return super(SongCreate, self).form_valid(form)

ОШИБКА, отображаемая при переходе по URL: http://127.0.0.1:8000/music/17/add/ равно

Request Method:     GET
Request URL:    http://127.0.0.1:8000/music/17/add/
Django Version:     1.11.12
Exception Type:     NoReverseMatch
Exception Value:    Reverse for 'detail' with arguments '('',)' not found. 1 pattern(s) tried: [u'music/(?P<pk>[0-9]+)/$']

Exception Location:     /usr/lib64/python2.7/site-packages/django/urls/resolvers.py in _reverse_with_prefix, line 497
Python Executable:  /usr/bin/python
Python Version:     2.7.15

Шаблон в шаблоне / music из корневого каталога корневого проекта является тем, который будет загружен при успешном выполнении URL / music // add / is song_create.html , как того требуют общие представления на основе классов.

{% extends 'music/album_thumbnail.html' %}
{% block title %}Add a Song{% endblock %}
{% load staticfiles %}

{% block right_to_thumbnail %}

<ul class="nav nav-pills" >
  <li role="presentation" >
    <a href="{% url 'music:detail' album.id %}">This Album</a>
  </li>
  <li role="presentation" class="active">
    <a href="#">Add a Song</a>
  </li>
</ul>

<div class="panel panel-default">
  <div class="panel-body">
    <h3> Add a new Song here</h3>
    {% if error_messege %}
      <p><strong>{{ error_message }}</strong></p>
    {% endif %}

    <form class="form-horizontal" role="form" acion="" enctype="multipart/form-data">
      {% csrf_token %}
      <input type="hidden" name="album" value="{{ album }}">
      {% include 'music/form_template.html' %}
      <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
          <button type="submit" class="btn btn-success">Submit</button>
        </div>
      </div>

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

{% endblock%}

Файл form-template.html выглядит следующим образом

    {% for field in form %}
  <div class="form-group">
    <div class="col-sm-offset-2-col-sm-10">
      <span class="text-danger small">{{ field.errors }}</span>
    </div>
    <label class="control-label col-sm-2">
      {{field.label_tag}}
    </label>
      <div class="col-sm-10">{{ field }}</div>
  </div>
{% endfor %}

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Вы ничего не сделали в CreateView, чтобы получить альбом по URL и передать его в шаблон. Вам нужно перезаписать get_context_data:

def get_context_data(self, *args, **kwargs):
    kwargs['album'] = Album.objects.get(pk=self.kwargs['pk'])
    return super().get_context_data(*args, **kwargs)

Вам также нужно изменить form_valid, так как нет такой вещи как self.request.album.

def form_valid(self, form):
    temp = form.save(commit=False)
    temp.album = Album.objects.get(pk=self.kwargs['pk'])
    temp.save()
    return super(SongCreate, self).form_valid(form)
0 голосов
/ 05 июля 2018

Попробуйте:

url(r'^(?P<pk>[0-9]+)/add/$', views.SongCreate.as_view(success_url=reverse('success-url')), name='song-add'),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...