Guest User

Untitled

a guest
Feb 22nd, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.26 KB | None | 0 0
  1. from django.contrib.contenttypes.fields import GenericForeignKey
  2. from django.contrib.contenttypes.models import ContentType
  3. from django.db import models
  4.  
  5.  
  6. class CommonInfo(models.Model):
  7. title = models.CharField('Название', max_length=100)
  8.  
  9. class Meta:
  10. abstract = True
  11.  
  12. def __str__(self):
  13. return self.title
  14.  
  15.  
  16. class Page(CommonInfo):
  17.  
  18. class Meta:
  19. verbose_name = 'Page'
  20. verbose_name_plural = 'Pages'
  21.  
  22.  
  23. class Article(CommonInfo):
  24.  
  25. class Meta:
  26. verbose_name = 'Article'
  27. verbose_name_plural = 'Article'
  28.  
  29.  
  30. class Menu(CommonInfo):
  31.  
  32. class Meta:
  33. verbose_name = 'Menu'
  34. verbose_name_plural = 'Menus'
  35.  
  36.  
  37. class MenuItem(CommonInfo):
  38.  
  39. menu = models.ForeignKey(Menu, on_delete=models.CASCADE)
  40.  
  41. content_type = models.ForeignKey(
  42. ContentType,
  43. null=True,
  44. blank=True,
  45. editable=False,
  46. on_delete=models.CASCADE,
  47. )
  48.  
  49. object_id = models.PositiveIntegerField(
  50. null=True,
  51. blank=True,
  52. editable=False,
  53. )
  54.  
  55. location = GenericForeignKey('content_type', 'object_id')
  56.  
  57. class Meta:
  58. verbose_name = 'Menu'
  59. verbose_name_plural = 'Menus'
  60.  
  61. from dal_select2_queryset_sequence.views import Select2QuerySetSequenceView
  62.  
  63. from queryset_sequence import QuerySetSequence
  64.  
  65. from .models import Page, Article
  66.  
  67.  
  68. class LocationAutocompleteView(Select2QuerySetSequenceView):
  69. def get_queryset(self):
  70. page = Page.objects.all()
  71. article = Article.objects.all()
  72.  
  73. if self.q:
  74. page = page.filter(title__icontains=self.q)
  75. article = article.filter(title__icontains=self.q)
  76.  
  77. # Aggregate querysets
  78. qs = QuerySetSequence(page, article)
  79.  
  80. if self.q:
  81. # This would apply the filter on all the querysets
  82. qs = qs.filter(title__icontains=self.q)
  83.  
  84. # This will limit each queryset so that they show an equal number
  85. # of results.
  86. qs = self.mixup_querysets(qs)
  87.  
  88. return qs
  89.  
  90. from django.contrib import admin
  91. from django.urls import path
  92. from app.views import LocationAutocompleteView
  93.  
  94. urlpatterns = [
  95. path('admin/', admin.site.urls),
  96. path(
  97. 'location-autocomplete/',
  98. LocationAutocompleteView.as_view(),
  99. name='location-autocomplete'
  100. ),
  101. ]
  102.  
  103. from dal import autocomplete
  104. from dal_queryset_sequence.fields import QuerySetSequenceModelField
  105. from dal_select2_queryset_sequence.widgets import QuerySetSequenceSelect2
  106. from .models import Page, Article, MenuItem
  107.  
  108.  
  109. class MenuItemForm(autocomplete.FutureModelForm):
  110. location = QuerySetSequenceModelField(
  111. queryset=autocomplete.QuerySetSequence(
  112. Page.objects.all(),
  113. Article.objects.all(),
  114. ),
  115. required=False,
  116. widget=QuerySetSequenceSelect2('location-autocomplete'),
  117. )
  118.  
  119. class Meta:
  120. model = MenuItem
  121. fields = ('title', 'location', )
  122.  
  123. from django.contrib import admin
  124. from .models import Menu, MenuItem
  125. from .forms import MenuItemForm, Page, Article
  126.  
  127.  
  128. class MenuItemInline(admin.TabularInline):
  129. model = MenuItem
  130. form = MenuItemForm
  131.  
  132.  
  133. class MenuAdmin(admin.ModelAdmin):
  134. inlines = [
  135. MenuItemInline,
  136. ]
  137.  
  138.  
  139. admin.site.register(Menu, MenuAdmin)
  140. admin.site.register(Page)
  141. admin.site.register(Article)
Add Comment
Please, Sign In to add comment