1

I got two models. One model for building main menu, another one - for Articles. Every Article have ForeignKeyto link it to main menu item.

I can't figured out, how can I show on page Article, that linked to menuItem Model and how to use menuItem model's alias field for URL address?

My model menuItem:

    # -*- coding: utf-8 -*-
    from django.db import models

    class MainMenuItem(models.Model):
        class Meta:
            db_table = "menu_item"  
        title = models.CharField(max_length = 50)
        alias = models.CharField(max_length = 50)

        def __unicode__(self):
            return self.title

        def __str__(self):
            return self.title

My model Article:

    class Article(models.Model):
        class Meta:
            db_table = "article"

        menu = models.ForeignKey(MainMenuItem, blank = True, null = True)
        active = models.BooleanField(default = True)
        created = models.DateTimeField(auto_now_add=True)
        updated = models.DateTimeField(auto_now=True)

        def __unicode__(self):
            return unicode(self.menu) or u''

        def __str__(self):
            return self.menu

My views.py

    def menu_builder(request, alias):
        findId = MainMenuItem.objects.????
        elements = {
            'menuItems': MainMenuItem.objects.all(),
            'article': Article.objects.get(id=??????),
        }
        return render_to_response('myview.html', elements)

My urls.py:

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^(?P<alias>.+?)/$', 'menuItem.views.menu_builder'),
    ]
s.spirit
  • 343
  • 1
  • 7
  • 19

1 Answers1

2

You just filter by the alias on MainMenuItem then get all articles that related to that MainMenuItem:

def menu_builder(request, alias):
    main_menu_item = MainMenuItem.objects.get(alias=alias)
    elements = {
            'menuItems': main_menu_item,
            'articles': main_menu_item.article_set.all(),
        }
    return render_to_response('myview.html, elements)

Django doc about related object lookup using _set.

Edit:

I should have been using objects.get() previously, but was using objects.filter() which is wrong. The difference is that you should get exactly one item so that you could get related articles to that object. If you use filter, you would end up having a queryset, but then it doesn't make sense to check related objects on multiple objects, hence the error 'QuerySet' object has no attribute 'article_set'.

Beware that you should have distinct alias for MainMenuItem objects, otherwise get() would throw an exception "Multiple objects returned".

Shang Wang
  • 24,909
  • 20
  • 73
  • 94
  • Hi! And thanks for an answer. I tried to use your code, but got `'QuerySet' object has no attribute 'article_set'` I tried to make related name, but still got same error... – s.spirit Jun 01 '16 at 20:04
  • I made a mistake and corrected my answer. I try to explain as much as I can because I don't want to spoon-feed with answers. Please check this about the details: http://stackoverflow.com/questions/3221938/difference-between-djangos-filter-and-get-methods – Shang Wang Jun 01 '16 at 20:21