ホーム>source

私はDjangoを始めたばかりで、現在は一見単純な要件/動作にとどまっています。クラスのForeignKeyに基づいてフィルターされたエントリのセットでレンダリングされ、他のクラスのレンダリングビューから呼び出されるページが必要です。

model.pyの簡易版は次のとおりです。

from django.db import models
class BookDay(models.Model):
    bookdate = models.DateField()
    bookevent = models.CharField(max_length=255)
class BookTime(models.Model):
    booktime = models.TimeField()
    bookdate = models.ForeignKey(BookDay, on_delete = models.CASCADE)

私のview.pyの読み取り:

from django.http import HttpResponse
from django.views import generic
from .models import BookDay, BookTime
class DayView(generic.ListView):
    template_name = 'booking/days.html'
    context_object_name = 'bookdate_list'
    def get_queryset(self):
     return BookDay.objects.order_by('bookdate')
class TimeView(generic.ListView):
    model = BookDay 
    template_name = 'booking/booktimes.html'
    context_object_name = 'booktimes_list'
    def get_queryset(self):
     return BookTime.objects.filter(bookdate=bookday_id).order_by('booktime')

私のurls.pyに含まれるもの:

   from django.urls import path
    from . import views
    app_name = 'booking'
    urlpatterns = [
        path('', views.DayView.as_view(), name='bookdays'),
        path('<int:pk>/', views.TimeView.as_view(), name='booktimes'),
    ]

参照されるdays.htmlは、このフラグメントごとに一連のリンクをレンダリングします。

{% for entry in bookdate_list %}
    <li><a href="{% url 'booking:teetimes' entry.id %}">{{ entry.bookevent }}</a></li>
{% endfor %}

結果のリンクをクリックすると、失敗は name 'bookday_id' is not defined として現れます 。

bookday_id の代わりに固定整数を置くことができます  上記のviews.pyで、正常に動作します(ForeignKeyのみ、明らかに)。また、filter()パラメーター名、関連するurl、およびhtmlを広範囲にわたっていじってみましたが、役に立ちませんでした。

クリックされたリンクを取得してBookTimesエントリを正しくフィルタリングするには、これをどのようにパラメーター化する必要がありますか?このためにDjangoフィルターを使用する必要がありますか、それともDjangoでネイティブに実行できますか?

あなたの答え
  • 解決した方法 # 1

    エラーが示すように、 bookday_id はありません  変数。私がそれを正しく理解しているなら、あなたは pk に興味があります  URLのパラメーター。これらにアクセスできますポジショナル そして名前付き  self.args のパラメーター  および self.kwargs   View の  オブジェクト。したがって、次のように書き換えることができます。

    class TimeView(generic.ListView):
        model = BookDay 
        template_name = 'booking/booktimes.html'
        context_object_name = 'booktimes_list'
        def get_queryset(self):
            return BookTime.objects.filter(bookdate_id=self.kwargs['pk']).order_by('booktime')
    
    

    pk 以来  は int です 、このように bookdate_id でフィルタリングします  (ここでは整数です)。

    ただし、 bookdate の名前を変更することをお勧めします  foreignkeyから bookday  (それが参照するモデルの名前)、今では bookdate との混乱を引き起こす   BookDay のフィールド  モデル。

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ Typescript AngularのインターフェースでAPI応答データを確認する