Найти - Пользователи
Полная версия: Использование inlines
Начало » Django » Использование inlines
1
tol_drew
Добрый день!
Есть модели
.....
class Player (models.Model):
    family = models.CharField(max_length=20, verbose_name='фамилия')
    name = models.CharField(blank=True, max_length=20, verbose_name='имя')
    date_rojd = models.DateField(blank=True, null=True, verbose_name='дата рождения')
    positions = models.ForeignKey(Position, verbose_name='позиция',blank=True, null=True)
    kommand = models.ForeignKey(Komanda, verbose_name='команда')
class Matches (models.Model):
    data = models.DateField(verbose_name='дата')
    time = models.TimeField(verbose_name='время начала')
    home = models.ForeignKey(Komanda, verbose_name='хозяева')
    guest = models.ForeignKey(Komanda, related_name='guest', verbose_name='гости')
    reffery = models.ForeignKey(Refery, verbose_name='судья')
    tur = models.ForeignKey(Tury, verbose_name='Тур', blank=True, null=True)
    goal_h = models.IntegerField(null=True, blank=True, verbose_name='голы хозяева')
    goal_g = models.IntegerField(null=True, blank=True, verbose_name='голы гости')    
class Statistika (models.Model):
    match = models.ForeignKey(Matches,verbose_name='матч')
    igrok = models.ForeignKey(Player, verbose_name='игрок')
    event = models.ForeignKey(Events,verbose_name='событие')
    kvo = models.IntegerField(verbose_name='количество')
....
В admin.py:
....
class StatsInline (admin.TabularInline):
    model = Statistika
    extra = 1
class MatchesAdmin (admin.ModelAdmin):
    list_display = ('tur', 'data', 'time', 'home', 'guest', 'goal_h', 'goal_g', 'reffery')
    inlines = [StatsInline]
....
как сделать, чтобы в inlines в поле Igrok отображались только те Player'ы, которые принадлежат либо home, либо guest?
tol_drew
Неужели никто помочь не может, я не думаю, что это сложно, но никак не получается
DayFan
Для начала ты должен создать форму для отображения для StatsInline. Допустим как то так:
class Stat(forms.ModelForm):
    match = forms.ModelChoiceField(queryset=Matches.objects.all())
    igrok = forms.ModelChoiceField(queryset=Player.objects.filter(name='a'))
    event = models.ModelChoiceField(queryset=Events.objects.all())
    kvo = forms.IntegerField()
    class Meta:
        model =  Statistika
где значение queryset ты меняешь на свое, в данном случае в поле igrok будут показаны только игроки с именем “a” =) А в StatsInline указываешь какую форму надо использовать:
class StatsInline (admin.TabularInline):
    model = Statistika
    form = Stat
    extra = 1
tol_drew
Спасибо большое
tol_drew
Нашел другое решение без создания формы. В admin.py внес изменения:
class StatsInline (admin.TabularInline):
    model = Statistika
    extra = 1
class MatchesAdmin (admin.ModelAdmin):
    list_display = ('tur', 'data', 'time', 'home', 'guest', 'goal_h', 'goal_g', 'reffery')
    inlines = [StatsInline]
    def change_view(self, request, object_id, extra_context=None):
          def formfield_for_foreignkey(self, db_field, request, **kwargs):
              if db_field.name == 'igrok':
                  hozyaeva = Komanda.objects.get(nazvanie=Matches.objects.get(id=object_id).home).id
                  gosti = Komanda.objects.get(nazvanie=Matches.objects.get(id=object_id).guest).id
                  kwargs['queryset'] = Player.objects.filter(kommand__in=[hozyaeva, gosti])
              return super(StatsInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
          StatsInline.formfield_for_foreignkey = formfield_for_foreignkey
          self.inline_instances = [StatsInline(self.model, self.admin_site)]
          return super(MatchesAdmin, self).change_view(request, object_id,
              extra_context=extra_context)
Правда не очень нравится получение id команд (hozyaeva, gosti), участвующих в матче, может можно проще?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB