Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 24, 2014 15:41:28

tol_drew
Зарегистрирован: 2014-09-24
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование inlines

Добрый день!
Есть модели

.....
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 (Сен. 24, 2014 15:42:19)

Офлайн

#2 Сен. 26, 2014 13:48:25

tol_drew
Зарегистрирован: 2014-09-24
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование inlines

Неужели никто помочь не может, я не думаю, что это сложно, но никак не получается

Офлайн

#3 Сен. 26, 2014 16:23:16

DayFan
От:
Зарегистрирован: 2011-01-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование inlines

Для начала ты должен создать форму для отображения для 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



Отредактировано DayFan (Сен. 26, 2014 16:23:47)

Офлайн

#4 Сен. 27, 2014 06:38:24

tol_drew
Зарегистрирован: 2014-09-24
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование inlines

Спасибо большое

Офлайн

#5 Сен. 29, 2014 19:26:35

tol_drew
Зарегистрирован: 2014-09-24
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование inlines

Нашел другое решение без создания формы. В 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), участвующих в матче, может можно проще?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version