2017-12-26 5 views
0

Ich habe zwei ModellklassenWie Objekte kategorisieren, die mit ForeignKey Django

class Category(models.Model): 
    name = models.CharField(max_length=200) 

    def __str__(self): 
     return self.name 

und

class Site(models.Model): 
    name = models.CharField(max_length=200) 
    category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True) 
    link = models.CharField(max_length=200) 
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True) 


    def __str__(self): 
     return self.name 

So in den Vorlagen, wollte ich (zusammen) Websites mit der gleichen Kategorie kategorisieren zusammen . Wie dort

  {% for category in category_list %} 
      <li><a href="">{{ category.name }}</a></li> 
      {% endfor %} 

und wenn Sie nach einer Kategorie Links mit allen Kategorien auf der Startseite wird auf den Link klicken, werden die Seiten mit den gleichen Kategorien. Wie mache ich das?

+0

Dieser Teil ist verwirrend: "Also in den Templates wollte ich Websites mit der gleichen Kategorie zusammenstellen (zusammenstellen). Da wird es Links mit allen Kategorien auf der Homepage geben." Was hat der zweite Satz mit dem ersten zu tun? Möchten Sie zwei verschiedene Vorlagen, eine mit dem Verhalten des früheren Satzes und eine andere für die Homepage? – ubadub

+0

Entschuldigung Es war verwirrend. Ja, 2 Vorlagen. – Mohammed7

Antwort

0

views.py

from django.views.generic import ListView 

class SiteView(ListView): 
    template_name = 'site.html' 
    context_object_name = 'site_list' 
    paginate_by = 8 

    def get_category(self): 
     category_id = self.request.GET.get('category', '') 
     if category_id: 
      try: 
       category = Category.objects.get(id=category_id) 
      except ObjectDoesNotExist: 
       category = None 
     else: 
      category = None 
     return category 

    def get_queryset(self): 
     category = self.get_category() 
     if category: 
      return Site.objects.filter(category=category).all() 
     else: 
      return Site.objects.all() 

urls.py

url(r'^site/$', SiteView.as_view(), name='site'), 

templates

 {% for category in category_list %} 
      <li><a href="{% url 'site' %}?category={{ category.id }}">{{ category.name }}</a></li> 
     {% endfor %} 
+0

Ich habe den Code ein bisschen optimiert und es hat funktioniert! Vielen Dank .. – Mohammed7

0

views.py

from django.shortcuts import get_list_or_404, get_object_or_404 

def category_view(request): 
    category_list = get_list_or_404(Category) 
    context = {'category_list': category_list} 
    return render(request, '-your_templates-/category.html', context) 

def site_view(request, cat_id): 
    category = get_object_or_404(Category, pk=cat_id) 
    context = {'category': category} 
    return render(request, '-your_templates-/site.html', context) 

urls.py

url(r'^category/$', views.category_view, name='category'), 
url(r'^category/(?P<cat_id>[0-9]+)/$', views.site_view, name='site'), 

category.html

{% for category in category_list %} 
    <li><a href="{% url 'app_name:site' category.id %}">{{ category.name }}</a></li> 
{% endfor %} 

Ich hoffe, das hilft.

Verwandte Themen