在views.py中是否有一种方法可以筛选多个类对象并将它们连接在一起?

huangapple go评论105阅读模式
英文:

Is there a way to filter multiple class objects in views.py and connect to each other?

问题

我有一个Django项目,我想要创建3个可以通过点击每个选择按钮来访问的菜单。

主菜单(如主食)>> 菜单(面食)>> 面食项目(bluh bluh)

  • 主菜单可以从主页访问 *

我在models.py中创建了3个类,分别是MainMenuMenuItem

  1. class MainMenu(models.Model):
  2. title = models.CharField(max_length=100)
  3. main_slug = models.SlugField(max_length=50, unique=True)
  4. created = models.DateTimeField("Date created", default=timezone.now)
  5. def __str__(self):
  6. return self.title
  7. class Menu(models.Model):
  8. title = models.CharField(max_length=100)
  9. slug = models.SlugField(max_length=50, unique=True)
  10. created = models.DateTimeField("Date created", default=timezone.now)
  11. main_menus = models.ForeignKey(MainMenu, default="", verbose_name="Menus", on_delete=models.SET_DEFAULT, null=True)
  12. def __str__(self):
  13. return f"{self.title}||{self.main_menus}"
  14. class Meta:
  15. ordering = ['-created']
  16. class Item(models.Model):
  17. title = models.CharField(max_length=100)
  18. price = models.CharField(max_length=12)
  19. description = models.TextField(blank=True)
  20. created = models.DateTimeField("Date created", default=timezone.now)
  21. menus = models.ForeignKey(Menu, default="", verbose_name="Menus", on_delete=models.SET_DEFAULT)
  22. def __str__(self):
  23. return f"{self.title}||{self.menus}"
  24. class Meta:
  25. ordering = ['-created']

然后在views.py中过滤了对象:

  1. def menus(request, main_slug):
  2. matching_menus = Menu.objects.filter(main_menus__main_slug=main_slug).all()
  3. return render(
  4. request=request,
  5. template_name='Menu.html',
  6. context={"objects": matching_menus}
  7. )
  8. def items(request, slug):
  9. matching_items = Item.objects.filter(menus__slug=slug).all()
  10. return render(
  11. request=request,
  12. template_name='Item.html',
  13. context={"objects": matching_items}
  14. )

urls.py中配置路由:

  1. urlpatterns = [
  2. ...
  3. path('<slug:main_slug>', views.menus),
  4. path('<str:slug>', views.items),
  5. ]

但是目前只有菜单被正确过滤,无法访问菜单中的项目。当点击"pastas"这样的菜单时,它加载一个空白的菜单HTML页面,并且不会显示任何错误。尝试连接三个菜单,但最终只连接了两个。

英文:

I have a Django project where I want to make 3 menus that can be accessed by clicking the select button in each

main_menu(like mainfood) &gt;&gt; menu(pastas) &gt;&gt; items of pastas(bluh bluh)

*main_menu is accessed from the homepage*

I have created 3 classes in models.py called MainMenu, Menu, Item

  1. class MainMenu(models.Model):
  2. title = models.CharField(max_length=100)
  3. main_slug = models.SlugField(max_length=50,unique=True)
  4. created = models.DateTimeField(&quot;Date created&quot;, default=timezone.now)
  5. def __str__(self):
  6. return self.title
  7. class Menu(models.Model):
  8. title = models.CharField(max_length=100)
  9. slug = models.SlugField(max_length=50,unique=True)
  10. created = models.DateTimeField(&quot;Date created&quot;, default=timezone.now)
  11. main_menus = models.ForeignKey(MainMenu,default=&quot;&quot;,verbose_name=&quot;Menus&quot;,on_delete=models.SET_DEFAULT, null=True)
  12. def __str__(self):
  13. return f&quot;{self.title}||{self.main_menus}&quot;
  14. class Meta:
  15. ordering = [&#39;-created&#39;]
  16. class Item(models.Model):
  17. title = models.CharField(max_length=100)
  18. price = models.CharField(max_length=12)
  19. description = models.TextField(blank=True)
  20. created = models.DateTimeField(&quot;Date created&quot;, default=timezone.now)
  21. menus = models.ForeignKey(Menu,default=&quot;&quot;,verbose_name=&quot;Menus&quot;,on_delete=models.SET_DEFAULT)
  22. def __str__(self):
  23. return f&quot;{self.title}||{self.menus}&quot;
  24. class Meta:
  25. ordering = [&#39;-created&#39;]

and I have filtered objects in views.py

  1. def menus(request,main_slug):
  2. matching_menus = Menu.objects.filter(main_menus__main_slug=main_slug).all()
  3. return render(
  4. request=request,
  5. template_name=&#39;Menu.html&#39;,
  6. context={&quot;objects&quot;: matching_menus}
  7. )
  8. def items(request,slug):
  9. matching_items = Item.objects.filter(menus__slug=slug).all()
  10. return render(
  11. request=request,
  12. template_name=&#39;Item.html&#39;,
  13. context={&quot;objects&quot;: matching_items}
  14. )

and the urls.py :

  1. urlpatterns = [
  2. ...
  3. path(&#39;&lt;slug:main_slug&gt;&#39;, views.menus),
  4. path(&#39;&lt;str:slug&gt;&#39;, views.items),
  5. ]

it kinda WORKS but only menu is filtered correctly.

I can go from MainMenu to Menu and the Menus are filtered correctly,

but I CANNOT access the items in the Menus. when I click a menu like "pastas" it loads up a blank menu html and doesn't give any errors.

tried to connect three menus but ended up connecting only two.

答案1

得分: 0

这是由于它始终匹配菜单的 URL。在您的示例中,字符串 "pastas" 可以同时匹配作为 slug 和字符串。由于菜单的 URL 先列出,Django 会选择它。

要修复这个问题,可以为不同的页面使用不同的 URL,例如:

  1. urlpatterns = [
  2. ...
  3. path('main_menu/<slug:main_slug>', views.menus),
  4. path('menu/<str:slug>', views.items),
  5. ]
英文:

It's because it's always matching the url for the menus. In your example, the string "pastas" can be matched both as a slug and as a string. Since the url for the menus is listed first, that is the one that is selected by Django.

To fix it, use different urls for the different pages, for example:

  1. urlpatterns = [
  2. ...
  3. path(&#39;main_menu/&lt;slug:main_slug&gt;&#39;, views.menus),
  4. path(&#39;menu/&lt;str:slug&gt;&#39;, views.items),
  5. ]

huangapple
  • 本文由 发表于 2023年6月6日 04:59:34
  • 转载请务必保留本文链接:https://go.coder-hub.com/76409960.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定