0

私は目的に応じて同じ名前のレコードが多いテーブルを照会しようとしています。私の例では、車のメイクを使用していますが、残念ながら私はすでに外来キーを使用していません。長い話。とにかく、私は以下に示すように、私は、私は、PostgreSQLを使用しているようModelChoiceFieldを使用し、個別のコマンドを使用してテーブルを照会することができると判断することができました:外部キーを使用しないデータベーステーブルの照会Django Postgresql

class Vehicle(forms.Form): 

    dropdown = forms.ModelChoiceField(queryset=Car.objects.none()) 

    def __init__(self, *args, **kwargs): 
     super(Vehicle, self).__init__(*args, **kwargs) 
     self.fields['dropdown'].empty_label = ''  
     qs = Car.objects.distinct('vehicle_make') 

上記のコードは、私がに関連する必要なものを行いますドロップダウンでは、ModelChoiceFieldを車のvehicle_makeの一意の値に制限します。

私のテンプレートには、そのvehicle_makeを持つすべてのレコードを表示しようとするのが難題です。私は詳細表示をしようとしましたが、それは私に個々のレコードを表示しています。詳細なビューはそのレコードのためのものなので意味がありますが、テーブルを照会して、そのvehicle_makeですべてのレコードを表示する方法を見つけようとしています。私はChoiceFieldも探検しましたが、これもうまくいくようには見えません。私はテンプレートの下のコードのいくつかのバリエーションを試しましたが、何も動作していないようです。

{% for vehicle_make in car.queryset %} 
    {{ vehicle_make }} 
{% endfor %} 

次のように私のモデルは次のとおりです。あなたの入力や提案を事前に

Car(models.Model): 
    vehicle_make = models.Charfield(max_length=264,unique=False) 

    def __str__(self): 
     return self.vehicle_make 

感謝。

+0

あなたもモデルを投稿できますか? – souldeux

+0

souldeuxはそれを助けますか? –

答えて

0

vehicle_makeの値がCar.objects.filter(vehicle_make = 'foo')のすべてのCarオブジェクトを照会できます。たとえば、このListViewはすべての車の一覧を表示します:

class FooCarListView(ListView): 
    context_object_name = "car_list" 
    queryset = Car.objects.filter(vehicle_make = 'foo') 

一つの簡単な方法は、このより「ダイナミック」を探すことになり作るために:

from django.views.generic.list import ListView 
from .models import Car 

class CarListView(ListView): 
    context_object_name = "car_list" 
    queryset = Car.objects.all() 

をこのビューは、すべての車をリストしに対し'foo'作りますurl内の検索クエリ。キーワード引数またはクエリー文字列として指定します。既存のフォームを使用してこのようなURLを作成し、ビューで解析することができます。たとえば、このビューは?search=barを付加したURLを探します:

class SearchableCarListView(ListView): 
    context_object_name = "car_list" 
    def get_queryset(self): 
     search_term = self.request.GET.get('search', None) 
     if search_term is not None: 
      return Car.objects.filter(vehicle_make = search_term) 
     return Car.objects.all() 

ご利用の場合は、より良いicontainsまたはiexactルックアップを使用することによって、あるいはDjangoのfull text searchを利用することによって提供することができます。これらのビューのいずれかのテンプレートで

、あなたがそうのようなあなたのクエリセットにCarのすべてのオブジェクトにアクセスすることができます。

{% for car in car_list %} 
    {{car}} 
{% endfor %} 

私が理解し、あなたの質問に対処していることを願っています。私はあなたのフォームを今どのように使用しているか100%確信していないので、私がそこに何か見落としてしまった場合は教えてください。


コメントで我々の議論の後、私はあなたのフォームで物事が複雑になり過ぎていると思うし、私はあなたの検索が欲しいものをやっていない可能性がありますと思います。

我々は、すべての個別vehicle_make値のValuesQuerySetを取得します:

qs = Car.objects.values('vehicle_make').distinct() 

は(参照:Select DISTINCT individual columns in django?を)これは次のようになりますValuesQuerySetを返し

<QuerySet [{'vehicle_make': 'vehicle_make_1'}, {'vehicle_make': 'vehicle_make_2'}...] 

vehicle_make_1vehicle_make_2などはあなたの別の値です。

私たちのテンプレートにこのクエリーセットqsを与え、select要素を構成することができます。我々はまた、それが簡単にテンプレート内で動作するようにするために値のリストに最初にそれを簡素化することができます:

values_list = [ c['vehicle_make'] for c in qs.all() ] 

は、私たちのテンプレートにその値をパスし、私たちのselect要素を作るためにそれを使用する:

<select name='search'> 
    {% for vehicle_make in values_list %} 
    <option value = {{vehicle_make}} > {{vehicle_make}} </option> 
    {% endfor %} 
</select> 

ここからいくつかの選択肢があります。私の意見では、最も簡単なことは、先に説明したようにGETメソッドを使用して検索URLを構築する形式でこのselect要素を使用することです。詳細については、この質問への最初の答えを確認してください:<form method="link" > or <a>? What's the difference?その最初の答えには、ベースの検索フォームを作成して、新しく作成したselect要素で簡単に作成できるコードスニペットがあります。

+0

お返事ありがとうございます。私は試して、ListViewにフィードする値を取得するために、フォームを使用しています。この場合、私はあなたが提案するURLアプローチを使用すべきですか?私は同じフォームを使うことができますが、新しいURLも作成する必要がありますか? –

+0

フォームで選択した値を使用して、前述したようなURLを作成できます。その後、ユーザーをそのURLにリダイレクトするか、またはそのURLを使用してサーバーからデータをフェッチして、既存のテンプレートを作成します。 2番目のアプローチは、AJAXの要求を伴います。 – souldeux

+0

助けてくれてありがとう。上記のすべてのコードをテストしたところ、私は最終的に何かダイナミックなことをしようとしていました。ドロップダウンボックスにvehicle_makeを入れて、その詳細でレコードを検索しようとしました。私はリストが役立つのを見てきましたが、私は最終的に、すべての属性を持つ1つのテーブルからすべてのレコードを取得しようとしています。私はDjangoの新機能です...レコードの詳細な表示を得るために、検索値をURLに追加するだけです。 –

関連する問題