python - italiano - Reverse per '*' con argomenti '()' e argomenti di parole chiave '{}' non trovati



bellinzona django (5)

Catturato un'eccezione durante il rendering:

Reverse per 'products.views.'filter_by_led' con argomenti '()' e argomenti di parole chiave '{}' non trovati.

Sono stato in grado di importare products.views.filter_by_led dalla shell e ha funzionato in modo che il percorso fosse corretto.

Ecco l'urls.py:

(r'^led-tv/$', filter_by_led ),

Qui è dove viene generato l'errore:

href="{% url products.views.filter_by_led %}">

Che non riesco a capire perché funziona bene nello stesso file:

{% url products.views.lcd_screen_size screen_size=50 %}

Ecco la definizione della funzione:

def filter_by_led(request):

Non capisco perché Django penserebbe che la funzione non sarebbe in grado di trovare il Reverse per quella funzione.

Ho cancellato tutti *.pyc file *.pyc e riavviato Apache.

Che cosa sto facendo di sbagliato?

https://ffff65535.com


Ci sono 3 cose che posso pensare in cima alla mia testa:

  1. Ho usato solo URL nominati , è comunque più robusto e manutenibile
  2. Prova a usare django.core.urlresolvers.reverse nella riga di comando per un (possibilmente) errore migliore

    >>> from django.core.urlresolvers import reverse
    >>> reverse('products.views.filter_by_led')
    
  3. Controlla se hai più di un URL che punta a quella vista


Hai bisogno di virgolette singole attorno al nome della vista

{% url 'viewname' %}

invece di

{% url viewname %}

Le chiamate Shell per il reverse (come già detto) sono molto utili per il debug di questi problemi, ma ci sono due condizioni critiche:

  • è necessario fornire argomenti che soddisfino gli argomenti di cui ha bisogno la vista,
  • questi argomenti devono corrispondere ai pattern di regexp.

Sì, è logico. Sì, è anche confuso perché il reverse invierà solo l'eccezione e non ti darà ulteriori suggerimenti.

Un esempio di pattern URL:

url(r'^cookies/(?P<hostname>[^/]+)/(?P<url_id>\d+)/$', 'register_site.views.show_cookies', name='show_cookies'),

E poi cosa succede nella shell:

>>> from register_site.views import show_cookies
>>> reverse(show_cookies)
NoReverseMatch: Reverse for 'register_site.views.show_cookies' with arguments '()' and keyword arguments '{}' not found.

Non funziona perché non ho fornito argomenti.

>>> reverse('show_cookies', kwargs={'url_id':123,'hostname': 'aaa'})
'/cookies/aaa/123'

Ora ha funzionato, ma ...

>>> reverse('show_cookies', kwargs={'url_id':'x','hostname': 'www.dupa.com'})
NoReverseMatch: Reverse for 'show_cookies' with arguments '()' and keyword arguments '{'url_id': 'x', 'hostname': 'www.dupa.com'}' not found.

Ora non ha funzionato perché url_id non corrispondeva alle espressioni regolari (numero previsto, stringa fornita).

È possibile utilizzare il contrario con entrambi gli argomenti posizionali e gli argomenti delle parole chiave. La sintassi è:

reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None)

Per quanto riguarda il tag modello dell'URL, c'è qualcosa di strano in proposito. La documentation Django fornisce un esempio dell'uso del nome della vista quotata:

{% url 'news.views.year_archive' yearvar%}

Così l'ho usato in un modo simile nel mio modello HTML:

{% url 'show_cookies' hostname = u.hostname url_id = u.pk%}

Ma questo non ha funzionato per me. Ma il messaggio di eccezione mi ha dato un suggerimento su cosa potrebbe essere sbagliato - nota le doppie virgolette singole attorno al nome della vista:

Reverse per '' show_cookies '' con argomenti ...

Ha iniziato a funzionare quando ho rimosso le virgolette:

{% url show_cookies hostname = u.hostname url_id = u.pk%}

E questo è confuso.


Nel caso in cui aiuti qualcuno, ho riscontrato un problema simile e l'errore è dovuto a due motivi:

  1. Non utilizzare lo spazio dei nomi dell'app prima del nome dell'URL

    {% url 'app_name:url_name' %}
    
  2. Singole virgolette mancanti attorno al nome dell'URL (come sottolineato here da Charlie)


{% url 'polls:create' poll.id %}




django-templates