Qual è il modo migliore per eseguire una casella di ricerca della barra di navigazione in Django?

StackOverflow https://stackoverflow.com/questions/1610934

  •  05-07-2019
  •  | 
  •  

Domanda

Vorrei avere una casella di ricerca integrata in una barra di navigazione che appare nella parte superiore di ogni pagina (ehi, c'è un esempio di ciò di cui sto parlando lassù nella parte superiore di questa pagina StackOverflow).

Forse nav.html potrebbe apparire come:

<ul id="menu">
    <li><a href="/products"></li>
    <li><a href="/service"></li>
    <li>{{ nav_search_form.as_p }}</li>
</ul>

Forse forme.py può contenere:

class NavSearchForm(forms.Form):
  query = forms.CharField(max_length=30, required=False)

Con il principio DRY non voglio che views.py cerchi una 'query' su ogni pagina come:

def ProductsPage(request):
    search_form = NavSearchForm()
    if request.GET.has_key('query'):
        query = request.GET['query'].strip()
    # deal with 'Products' here...

def ServicePage(request):
    search_form = NavSearchForm()
    if request.GET.has_key('query'):
        query = request.GET['query'].strip()
    # deal with 'Service' here...

Ho e posso facilmente programmare una pagina che gestirà la query di ricerca e mostrerà i risultati. Come è possibile estrarre al meglio i termini di ricerca e indirizzare l'utente a quella pagina di ricerca (restituire HttpResponseRedirect ('/ results /? Query =' + query)) senza rimuovere la richiesta. OTTENERE su ogni pagina?

È stato utile?

Soluzione

Basta fare in modo che il modulo di ricerca faccia il tuo URL di ricerca comune.

<form action="/search/" method="get">
...
</form>

Utilizzare la funzione di ricerca inversa dell'URL se non si desidera cablare l'URL ...

<form action="{% url my-search-view %}" method="get">
...
</form>

A meno che non abbia frainteso la domanda, sembra che tu stia forse pensando che i moduli debbano ottenere / pubblicare nello stesso URL che ha caricato la pagina corrente.

Altri suggerimenti

Utilizziamo un Google CSE su uno dei nostri siti ed è il più semplice possibile ottenere. Ci sono un paio di funzioni che puoi attivare, ma è banale e ottieni tutto lo standard Google Goodness ™.

  1. Usa una vista separata come suggerisce Joe Holloway.
  2. Usa potenza moduli

    def ProductsPage(request):
        search_form = NavSearchForm(request.GET)
        if search_form.is_valid():
            ....
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top