2017-01-24 6 views
0

Hier ist meine einfache Ansicht ist:Django Filterung QuerySet

def transaction_list(request): 
    current_user = request.user 
    month = datetime.date.today().month 

    try: 
     page = request.GET.get('page', 1) 
    except PageNotAnInteger: 
     page = 1 

    objects = Transaction.objects.filter(user=current_user, date__month=month) 
    p = Paginator(objects, 10, request=request) 
    transactions = p.page(page) 
    return render(request, 'transaction/list.html', 
        {'transactions': transactions}) 

Es hat eine Liste der Transaktionen zeigt, die im aktuellen Monat aufgetreten. Ich möchte eine Option hinzufügen, um den Monat der angezeigten Transaktionen zu ändern, aber ich habe keine Ahnung, wie ich das angehen und es zum Laufen bringen kann. Sollte es in einer Ansicht getan werden? vielleicht Vorlage? Ich würde mich über jede Idee freuen

+0

Der einzige Ort, dies zu tun in der Ansicht ist, sein unklar, was genau das Problem Sie haben – Sayse

+0

@Sayse Ich weiß nur nicht, wie Sie den Monat ändern, durch den Transaktionen gefiltert werden und machen Django zeigen thi s Transaktionen in gerenderten Vorlagen – Teryuu

+0

Ich habe meine Antwort bearbeitet, um Ihnen einige Details über die Handhabung von django ajax zu geben. – rob

Antwort

0

Nehmen Sie sich etwas Zeit, um einige Django-Dokumente zu lesen, da sie sich als sehr wertvoll erweisen können (nicht zu vergessen, dass sie für jede verfügbare Version sehr sauber und gut geschrieben sind). Ich würde mich auf Working With Forms

konzentrieren Kurz gesagt, übergeben Sie den Monat von Ihrer Django-Vorlage (vielleicht über Ajax oder ein einfaches HTML-Formular POST), zu Ihrer Ansicht, und verwenden Sie Ihre Ansicht-Funktion, um die POST-Daten zu erhalten das in Ihrem Abfrage-Set.

Es ist schwer, eine gute, gründliche Antwort zu geben, weil es verschiedene Möglichkeiten gibt, dies zu tun. Willst du AJAX? Einfache Form mit Seiten-Reload, etc?


Okay, hier, im Detail, ist, wie ich normalerweise eine POST-Anfrage behandeln. Dies ist nicht getestet Code, es ist nur Pseudo-Code, aber sollte arbeiten so weit ich kann sagen, abgesehen von ein paar kleinere Tippfehler wahrscheinlich. ABER, es sollte dir eine Idee geben, wie man mit Ajax-Anfragen in Django umgeht.

Dies ist ziemlich 101 und dauert einige Zeit, um die Dokumente zu lesen und durchlaufen einige der frühen Projekte deckt ein diese Konzepte viel ich, so dass meine Vertiefung ist nicht wirklich wertvoll für SO-Leser.

views.py

class change_date_form(forms.Form): 
    new_date = forms.DateField() 

def change_transaction_date(request): 
    #Do some checks to make sure user is authorized to do this 
    current_user = ... 
    customer_data = [] 
    if request.method == 'POST': 
     form = change_date_form(request.POST, request.FILES) 
     if form.is_valid(): 
      change_date = form.cleaned_data.get('new_date') 
      objects = Transaction.objects.filter(user=current_user, date__month=change_date) 
      for i in objects: 
       customer_data.append(objects.name) 
    response_data = json.dumps(customer_data) 
    return HttpResponse(response_data, content_type='application/json') 

urls.py

... 
url(r'^change_date_view/', 'module.views.change_transaction_date'), 

JQuery:

$('button_handler').on('click', function() { 
var new_date_value = $(date_field_selector).val() 
$.ajax({ 
    url: "/change_date_view/", 
    type: "POST", 
    data: { 
     new_date: button_handler, 
     }, 
    success:function(data) { 
     //build your html via javascript with response data 
     } 
}) 

}) 
+0

Ich wollte zwei Tasten auf der Liste setzen - vorheriger Monat und nächster Monat, die den Monat ändern würden. Ich denke, AJAX ist der bessere Weg, um solche Sachen zu machen? Oder kann dies mit Formularen einfacher gemacht werden? – Teryuu

+0

Sie können Formulare unabhängig davon verwenden, ob es sich um einen AJAX-POST handelt oder nicht. Ich würde dies sowohl mit Ajax- als auch mit Django-Formularen tun, obwohl es wirklich nur davon abhängt, ob Sie verhindern wollen, dass die Seite neu geladen wird oder nicht. – rob

+0

Die Seite kann neu geladen werden, es ist kein Problem für mich. Ich habe ein einfaches Formular erstellt, in dem Sie eine Monatsnummer eingeben und die Transaktionen in diesem Monat filtern, aber ich möchte nur die nächsten und vorherigen Schaltflächen verwenden, wobei das Feld die Nummer verdeckt eingeben soll. Ich kann es mit HiddenInput-Widget tun, aber es würde erfordern, dass ich ein Autoinkrementierungsfeld im Formular habe und ich kann das nicht funktionieren – Teryuu