2016-08-28 5 views
0

Djangoで設定されたクエリからHTMLの情報を表示しようとしています。しかし、私はそれを行う最善の方法を知らない。DjangoはクエリーセットでビューからオブジェクトをHTMLに返しますか?

このアイデアは、私がユーザーの名前とそれに関連する競技会の名前を表示するページを開いたときのアイデアです。ユーザーはDjangoの管理者で競争を作成することができます。

私のURLはそれです。

url(r'^home/(?P<company_name>\w+)', HomeView.as_view(), name='home'), 

モデルです。

class Competition(models.Model): 
    name = models.CharField(max_length=200,null=False) 
    image = models.CharField(max_length=200, null=False) 
    url = models.CharField(max_length=200, null=False) 
    startingDate = models.DateTimeField(null=False) 
    deadline = models.DateTimeField(null=False) 
    description = models.CharField(max_length=200, null=False) 
    user = models.ForeignKey(User, null=False) 

私がURLにこのような何か書くユーザー、返す上記のコードviews.py

class HomeView(ListView): 
    model = User, Competition 
    template_name = 'home.html' 
    context_object_name = 'company' 

    def get_queryset(self, **kwargs): 
     company = self.kwargs['company_name'] 
     try: 
      queryset = User.objects.filter(username__exact=company).get() 
     except User.DoesNotExist: 
      queryset = None 
     return queryset 

で:http://127.0.0.1:8000/home/diego/

HTMLの家は私のためにユーザーの名前を表示します例:

{% if company %} <div class="jumbotron"> <div class="container"> 
    {{company.username}} </div></div> {% endif %} 

ただし、ユーザーが作成したコンテストをHTMLの 'for'です。

私はチェーンで2つのクエリセットを返してみましたが、私はそれを動作させません。

これもまた。

queryset2 = Competition.objects.filter(user__username__exact=company).get() 

get()は、1つ以上のオブジェクトを返すエラーを表示します。これは、ユーザーがこれに関連する3つの競技を持っているため、論理です。

少しの例がありますか?または私の質問を解決するための任意のアイデア。

どうもありがとう

が、私はこれを試してみましたが、「ユーザー」オブジェクトが反復可能ではありません(もちろん、それはただ一つである)

class HomeView(ListView): 
model = User 
template_name = 'home.html' 
context_object_name = 'company' 

def get_queryset(self, **kwargs): 
    company = self.kwargs['company_name'] 

    try: 
     queryset = User.objects.filter(username__exact=company).get() 
     queryset2 = Competition.objects.filter(user__username__exact=company) 
     result_list = list(chain(queryset, queryset2)) 
    except User.DoesNotExist: 
     result_list = None 
    return result_list 

私がしようと試みると(GETを削除されています)最初のクエリセットとデータはHTMLに戻ります。

どのようにしてHTMLのリストの項目にアクセスできますか?そのクラスを使用して、変数 '会社'を印刷するとその結果が表示されます。

[<User: diego>, <Competition: test1>, <Competition: test2>] 

しかし、 'for'を使用すると、文字列の値が取得されます。どのようにすることができます私は違い「ユーザー」と「競争」

{%for compa in company%} 
    {{compa}} 
{%endfor%} 

結果は次のとおりです。 サンディエゴ test1の test2の

答えて

0

あなたがget_queryset、その複雑な異なるクエリセットを返すために持っていけません。リストビューにはget_context_dataという1つのメソッドがあります。 " これをオーバーライドして、余分なオブジェクトやデータを埋め込むことができます。例えば

ちょうどあなたが個別に企業と「競争」を取得されます。ここ

class HomeView(ListView): 
    model = User, Competition 
    template_name = 'home.html' 
    context_object_name = 'company' 

    def get_queryset(self, **kwargs): 
     company = self.kwargs['company_name'] 
     try: 
      queryset = User.objects.filter(username__exact=company).get() 
     except User.DoesNotExist: 
      queryset = None 
      return queryset 
    def get_context_data(self, **kwargs): 
     context = super(HomeView, self).get_context_data(**kwargs) 
     queryset2 = Competition.objects.filter(user__username__exact=company) 
     context['competitions'] = queryset2 
     return context 

を書きます。それらをテンプレートでうまく使いましょう。やってみなよ。それは動作するはずです

+0

ありがとうございます。 Vipul Vishnuそれは大丈夫です。 –

関連する問題