Django 3.0 -> Dostęp do QuerySet w Template

0

Witam,
Potrzebuję dynamicznie pobrać z bazy danych informację o statusie klikniętego elementu,
po czym wczytać go do pola <input> formularza. Niestety Django nie pozwala używać QuerySet i jej metod np: '.get()' w templates. <Dlaczego? >

Nie wiem jak podejść do tematu by uzyskać tylko ten jeden element.

Django zwraca poniższy błąd:

Could not parse the remainder: '(id=id).status' from 'events.objects.get(id=id).status'

eventClick: function (info) {
                    var id = info.event.id;
                    var start = moment(info.event.start).format("Y-MM-DD HH:mm:ss");
                    var end = moment(info.event.end).format("Y-MM-DD HH:mm:ss");

                    modal.style.display = "block";
                    $('#form_status').prop('value', {{ events.objects.get(id=id).status }} );
                    $('#form_start').prop('value', start );
                    $('#form_end').prop('value', end );

Poniżej dodaję wycinki kodu widoku oraz modelu:

def workhours_view(request):
    all_events = GodzinyPracy.objects.all()
    
    context = {
        "events": all_events,
        ...
    }
    return render(request, 'godziny_pracy.html', context)
class GodzinyPracy(models.Model):
    class Meta:
        verbose_name = 'Godzina pracy'
        verbose_name_plural = 'Godziny pracy'

    id = models.AutoField(primary_key=True)
    pracownik = models.ForeignKey(User, verbose_name="Pracownik", on_delete=models.CASCADE, null=True, blank=True)
    status = models.ForeignKey(StatusPracy, verbose_name="Status pracy", on_delete=models.CASCADE, null=True, blank=True)
    ...
    def __str__(self):
        return str(self.start) + " " + str(self.pracownik) + " " + str(self.status)

W pętli for nie było by problemu i wyglądało by to tak:

{% for event in events %}
                        {
                            status: "{{ event.status }}",
                            ...
                        },
{% endfor %}

Poszperałem trochę w dokumentacji Django i nie znalazłem odpowiedzi na moje pytanie :/

1

Możesz robić jakiś endpoint który zwróci ci szczegóły eventu po ID i uzyskać te dane używając https://api.jquery.com/jquery.get/
Opcja której nie polecam: custom template tag.

Poczytaj: https://docs.djangoproject.com/en/3.0/ref/models/querysets/ nie możesz używać queryset w szablonach w ten sposób {{ events.objects.get(id=id).status }}

0

Dziękuje za odpowiedź.
Podczas prób walki z tematem zdążyłem już wyeliminować możliwość użycia custom template tag.
Obecnie siędzę właśnie nad wymianą danych przez GET jednak mam problem z serializacją :/

Napisałem taką funkcje korzystającego z domyślnego serializera:

def get_event_status(request):
    id = request.GET.get("id", None)
    status = [GodzinyPracy.objects.get(id=id).status]
    data = (serializers.serialize("json",status, ensure_ascii=False))
    return JsonResponse(data, safe=False)

I pewnie wszystko działało by fajnie gdybym oczekiwał QuerySet w odpowiedzi a nie tylko jednego pola.
Zdaje sobie sprawę że muszę napisać własny Serializer jednak mam z tym problemy.

Odpowiedź w chwili obecnej wygląda tak:

[
{
"model":"czaspracy.statuspracy",
"pk":2,
"fields":{
"name":"Urlop Wypoczynkowy",
"color":"#D64B4B",
"text_color":"#FFFFFF"
}
}
]

A zależy mi na:

[
{
"status":"Urlop Wypoczynkowy",
}
]

Czy da się 'przyciąć' tą odpowiedź?

1

Spróbuj coś takiego:

from django.shortcuts import get_object_or_404

def get_event_status(request):
    working_hours = get_object_or_404(GodzinyPracy, id=request.GET.get('id', None))
    data = {
        'status': working_hours.status.name
    }
    return JsonResponse(data, safe=False)

Zmień też nazwy zmiennych/klas/funkcji itd. żeby były w języku angielskim.

0

Dziękuje - sprawa rozwiązana!

dla potomnych dodam że należało jeszcze zamienić Pythonowy dictionary na obiekt JSON żeby JS się tego nie czepiał.

return JsonResponse(json.dumps(data), safe=False)

1 użytkowników online, w tym zalogowanych: 0, gości: 1