2016-08-28 1 views
0

Я пытаюсь показать некоторую информацию в HTML из запроса, заданного в Django. Но я не знаю, как это сделать.Django возвращает объекты в HTML из вида с запросом?

Идея заключается в том, когда я открываю страницу, это покажет мне имя пользователя и связанные с ним соревнования. Пользователь может создать конкуренцию в admin 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 

Код выше вернуть мне Пользователя, когда я пишу в URL-адрес что-то вроде этого: http://127.0.0.1:8000/home/diego/

HTML-дома показать мне имя пользователя для пример:

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

Но мне нужно показать конкурсы, созданные пользователем с помощью a 'for' в HTML.

Я попытался с цепями вернуть два набора запросов, но я не работаю.

Также это.

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

Ошибка() показать мне ошибку, которая возвращает больше одного объекта. Это логично, потому что у пользователя есть 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 

Я пытался и пытался и удалить ГЭТ() для первого набора запросов и возврата данных в HTML.

Как я могу получить доступ к полям списка в HTML, но с классом. Если я печатаю переменную 'company', результат таков.

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

Но с 'for' просто получаю строковые значения. Как я могу разница в 'User' и 'Конкурс'

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

результат: диего test1 test2

ответ

0

вы не должны возвращать различные querysets из 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 

Здесь вы будете получать компанию и «соревнования» отдельно. Используйте их хорошо в шаблонах. просто попробуйте. Он должен работать

+0

Большое спасибо. Випул Вишну, он работает нормально. –