Django使用queryset将对象从视图返回到HTML?

时间:2016-08-28 23:48:08

标签: python html django django-queryset

我试图在Django的查询集中显示HTML中的一些信息。但我不知道最好的方法。

这个想法是当我打开页面时,向我显示用户名和与之相关的比赛。用户可以在Django的管理员中创建竞争。

我的网址是。

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)

在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主页向我显示User的名称,例如:

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

但是,我需要用HTML中的'for'来显示用户创建的比赛。

我尝试用链返回两个查询集,但我不工作。

也是这个。

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

get()向我显示返回更多一个对象的错误。这是逻辑,因为用户有3场与此相关的比赛。

一些小例子?或任何解决我问题的想法。

非常感谢

我试过这个,但'User'对象不可迭代(显然它只是一个)

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访问列表中的字段,如果我打印变量'company',结果就是。

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

但是'for'只是我获得了字符串值。我如何区分“用户”和“竞争”

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

结果是: 迭戈 TEST1 TEST2

1 个答案:

答案 0 :(得分:0)

你不必从get_queryset返回不同的查询集,它很复杂。列表视图有一个名为get_context_data的方法“ 你可以覆盖它来填充你想要的额外对象或数据。

例如只写

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

在这里,您将分别获得公司和“比赛”。在模板中很好地使用它们。就试一试吧。它应该工作